2011-01-06 36 views
16
Type t = typeof(bool); 
string typeName = t.Name; 

在這個簡單的例子中,typeName的值爲"Boolean"。我想知道是否/我怎麼能說"bool"C# - 通過反射獲取簡單類型的用戶友好名稱?

與int/Int32,double/Double,string/String相同。

+0

可能重複[我怎樣才能獲得在C#中類型的原始名字? ](http://stackoverflow.com/questions/4369737/how-can-i-get-the-primitive-name-of-a-type-in​​-c) – 2011-01-06 13:52:42

+1

與到目前爲止給出的答案相反,看看重複鏈接上面的更積極的方法:)(假設你很高興使用CSharpCodeProvider而不是「普通」的反射。) – 2011-01-06 13:53:29

回答

35
using CodeDom; 
using Microsoft.CSharp; 

// ... 

Type t = typeof(bool); 

string typeName; 
using (var provider = new CSharpCodeProvider()) 
{ 
    var typeRef = new CodeTypeReference(t); 
    typeName = provider.GetTypeOutput(typeRef); 
} 

Console.WriteLine(typeName); // bool 
5

你稱之爲「友好名稱」是語言特定的,而不是綁定到框架。因此,將這些信息放在框架中並沒有意義,MS設計準則要求您爲方法名稱等使用框架名稱(如ToInt32等)。

+1

它在框架中。你可以通過CodeDom和CSharpCodeProvider獲得它。詳情請參閱我的回答。 – LukeH 2011-01-06 14:00:17

2

據我所知,bool,string,int等只是我們C#開發人員的別名。

編譯器處理完一個文件後,其中沒有更多的文件存在。

1

你不能。這些都是特定於C#的關鍵字。但是你可以很容易地將它們映射:

switch (Type.GetTypeCode(t)) { 
    case TypeCode.Byte: return "byte"; 
    case TypeCode.String: return "string"; 
} 

+0

返回枚舉枚舉(因爲枚舉默認基於Int32),所以可能不是OP所需的。 – CodesInChaos 2011-01-06 14:01:06

1

在.NET框架本身不知道C#的關鍵字。但由於只有大約十幾個人,你可以簡單地手動創建一個包含你想要的名字的表。

這可能是一個Dictionary<Type,string>

private static Dictionary<Type,string> friendlyNames=new Dictionary<Type,string>(); 

static MyClass()//static constructor 
{ 
    friendlyNames.Add(typeof(bool),"bool"); 
    ... 
} 

public static string GetFriendlyName(Type t) 
{ 
    string name; 
    if(friendlyNames.TryGet(t,out name)) 
    return name; 
    else return t.Name; 
} 

此代碼不能與T?取代Nullable<T>,不改造仿製藥到窗體C#使用。

0

我想說你不能這樣做,因爲這些名字是C#特有的,因此如果開發人員想使用VB.NET就不會產生相同的結果。

您正在獲得CLR類型,而這確實是您希望能夠稍後重新創建類型的。但是你總是可以寫一個名字映射器。

0

你總是可以創建一個字典到C#的名字翻譯成你想要的「友好」的:

Dictionary<System.Type, string> dict = new Dictionary<System.Type, string>(); 
dict[typeof(System.Boolean)] = "bool"; 
dict[typeof(System.string)] = "string"; 
// etc... 
相關問題