【问题标题】:Get user-friendly name of simple types through reflection?通过反射获取简单类型的用户友好名称?
【发布时间】:2011-06-04 16:08:48
【问题描述】:
Type t = typeof(bool);
string typeName = t.Name;

在这个简单的示例中,typeName 将具有值 "Boolean"。我想知道是否/如何让它说"bool"

对于 int/Int32、double/Double、string/String 也是如此。

【问题讨论】:

标签: c# reflection types


【解决方案1】:
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

【讨论】:

  • 你是我的新英雄。我一直在努力处理字符串操作和正则表达式,试图转换为泛型生成的丑陋的类型名称,但没有得到很好的结果。这非常有效!
【解决方案2】:

.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;
}

此代码不会将Nullable&lt;T&gt; 替换为T?,也不会将泛型转换为C# 使用的形式。

【讨论】:

    【解决方案3】:

    您总是可以创建一个字典来将 C# 名称翻译成您想要的“友好”名称:

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

    【讨论】:

      【解决方案4】:

      我会说你不能,因为这些名称是特定于 C# 的,因此如果开发人员想使用 VB.NET,则不会产生相同的结果。

      您正在获得 CLR 类型,而这正是您希望以后能够重新创建该类型的内容。但是你总是可以写一个名字映射器。

      【讨论】:

        【解决方案5】:

        你不能。这些都是 C# 特定的关键字。但是您可以轻松地映射它们:

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

        【讨论】:

        • 为枚举返回 int(因为枚举默认基于 Int32),所以可能不是 OP 想要的。
        【解决方案6】:

        据我了解,boolstringint 等只是我们 C# 开发人员的别名。

        编译器处理完一个文件后,它们实际上不再存在了。

        【讨论】:

          【解决方案7】:

          您所称的“友好名称”是特定于语言的,与框架无关。因此,在框架中包含这些信息是没有意义的,并且 MS 设计指南要求您将框架名称用于方法名称等(例如 ToInt32 等)。

          【讨论】:

          • 它在框架中。您可以使用 CodeDom 和 CSharpCodeProvider 来实现它。详情见我的回答。
          • 致反对者——是的,您可以通过 CSharpCodeProvider 获得他们。因为这个类是 C# 特定的,而且正如我所说,这些名称是特定于语言的,而不是框架的通用名称。 .NET 上的其他语言不使用它们或以不同的方式调用它们。这是我的观点...
          猜你喜欢
          • 2013-05-04
          • 1970-01-01
          • 1970-01-01
          • 2017-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-12
          相关资源
          最近更新 更多