C#-通过反射获得简单类型的用户友好名称?
在这个简单的示例中,C#-通过反射获得简单类型的用户友好名称?,c#,reflection,types,C#,Reflection,Types,在这个简单的示例中,typeName将具有值“Boolean”。我想知道我是否/如何能让它说“bool” int/Int32、double/double、string/string也一样。您所称的“友好名称”是特定于语言的,不与框架相关联。因此,在框架中包含这些信息是没有意义的,MS设计指南要求您使用框架名称作为方法名称等(如到int32等)。据我所知,bool,字符串,int等,只是我们C开发者的别名 在编译器处理完一个文件后,它们实际上就不存在了。你不能。这些都是C#特有的关键词。但您可以轻
typeName
将具有值“Boolean”
。我想知道我是否/如何能让它说“bool”
int/Int32、double/double、string/string也一样。您所称的“友好名称”是特定于语言的,不与框架相关联。因此,在框架中包含这些信息是没有意义的,MS设计指南要求您使用框架名称作为方法名称等(如
到int32
等)。据我所知,bool
,字符串
,int
等,只是我们C开发者的别名
在编译器处理完一个文件后,它们实际上就不存在了。你不能。这些都是C#特有的关键词。但您可以轻松地映射它们:
Type t = typeof(bool);
string typeName = t.Name;
etcnet框架本身不知道特定于C#的关键字。但是,由于它们只有十几个,您可以简单地手动创建一个包含所需名称的表 这可能是一本
词典
:
private static Dictionary friendlyNames=new Dictionary();
静态MyClass()//静态构造函数
{
添加(typeof(bool),“bool”);
...
}
公共静态字符串GetFriendlyName(类型t)
{
字符串名;
if(friendlyNames.TryGet(t,out name))
返回名称;
否则返回t.Name;
}
这段代码不会将
Nullable
替换为t?
,也不会将泛型转换为C所使用的形式。我想说你不能,因为这些名称是特定于C的,因此如果开发人员想使用VB.NET,就不会产生相同的结果
您将获得CLR类型,而这正是您希望稍后能够重新创建该类型的内容。但是你可以编写一个名称映射器。你可以创建一个字典,将C#名称翻译成你想要的“友好”名称:
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;
}
Dictionary dict=new Dictionary();
dict[typeof(System.Boolean)]=“bool”;
dict[typeof(System.string)]=“string”;
//等等。。。
可能的重复与目前给出的答案相反,请查看上面链接的重复以获得更积极的方法:)(假设您乐于使用CSharpCodeProvider而不是“普通”反射。)可能的重复在框架中。您可以通过CodeDom和CSharpCodeProvider获得它。查看我的答案了解详细信息。返回枚举的int(因为默认情况下枚举基于Int32),因此可能不是OP想要的。你是我的新英雄。我一直在努力进行字符串操作,而正则表达式试图转换为泛型生成的丑陋类型名,但却没有很好的结果。这很好用!
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;
}
Dictionary<System.Type, string> dict = new Dictionary<System.Type, string>();
dict[typeof(System.Boolean)] = "bool";
dict[typeof(System.string)] = "string";
// etc...
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