Type t = typeof(bool);
string typeName = t.Name;
在這個簡單的例子中,typeName
的值爲"Boolean"
。我想知道是否/我怎麼能說"bool"
。C# - 通過反射獲取簡單類型的用戶友好名稱?
與int/Int32,double/Double,string/String相同。
Type t = typeof(bool);
string typeName = t.Name;
在這個簡單的例子中,typeName
的值爲"Boolean"
。我想知道是否/我怎麼能說"bool"
。C# - 通過反射獲取簡單類型的用戶友好名稱?
與int/Int32,double/Double,string/String相同。
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
的
你稱之爲「友好名稱」是語言特定的,而不是綁定到框架。因此,將這些信息放在框架中並沒有意義,MS設計準則要求您爲方法名稱等使用框架名稱(如ToInt32
等)。
它在框架中。你可以通過CodeDom和CSharpCodeProvider獲得它。詳情請參閱我的回答。 – LukeH 2011-01-06 14:00:17
據我所知,bool
,string
,int
等只是我們C#開發人員的別名。
編譯器處理完一個文件後,其中沒有更多的文件存在。
你不能。這些都是特定於C#的關鍵字。但是你可以很容易地將它們映射:
switch (Type.GetTypeCode(t)) {
case TypeCode.Byte: return "byte";
case TypeCode.String: return "string";
}
等
返回枚舉枚舉(因爲枚舉默認基於Int32),所以可能不是OP所需的。 – CodesInChaos 2011-01-06 14:01:06
在.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#使用。
我想說你不能這樣做,因爲這些名字是C#特有的,因此如果開發人員想使用VB.NET就不會產生相同的結果。
您正在獲得CLR類型,而這確實是您希望能夠稍後重新創建類型的。但是你總是可以寫一個名字映射器。
你總是可以創建一個字典到C#的名字翻譯成你想要的「友好」的:
Dictionary<System.Type, string> dict = new Dictionary<System.Type, string>();
dict[typeof(System.Boolean)] = "bool";
dict[typeof(System.string)] = "string";
// etc...
可能重複[我怎樣才能獲得在C#中類型的原始名字? ](http://stackoverflow.com/questions/4369737/how-can-i-get-the-primitive-name-of-a-type-in-c) – 2011-01-06 13:52:42
與到目前爲止給出的答案相反,看看重複鏈接上面的更積極的方法:)(假設你很高興使用CSharpCodeProvider而不是「普通」的反射。) – 2011-01-06 13:53:29