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;

etc

net框架本身不知道特定于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