【问题标题】:Get type name without full namespace获取没有完整命名空间的类型名称
【发布时间】:2011-03-24 16:52:18
【问题描述】:

我有以下代码:

return "[Inserted new " + typeof(T).ToString() + "]";

但是

 typeof(T).ToString()

返回包含命名空间的全名

有没有办法只获取类名(没有任何命名空间限定符?)

【问题讨论】:

  • 顺便说一句,写string1 + anything.ToString() + string2 是多余的。如果您执行string1 + anything + string2,编译器会自动插入对ToString 的调用。
  • 听起来并不刺耳,但是,您是否检查过Type 实例上可用的属性(由typeof(..) 返回)我很确定您会自己弄清楚这一点...
  • 由于某种原因,文档中缺少 Name 属性 - 至少,它不是我要找的地方。

标签: c# namespaces typeof


【解决方案1】:
你可以这样做:
typeof(T).Name;

【讨论】:

    【解决方案2】:

    C#6.0(含)之后可以使用nameof表达式:

    using Stuff = Some.Cool.Functionality  
    class C {  
        static int Method1 (string x, int y) {}  
        static int Method1 (string x, string y) {}  
        int Method2 (int z) {}  
        string f<T>() => nameof(T);  
    }  
    
    var c = new C()  
    
    nameof(C) -> "C"  
    nameof(C.Method1) -> "Method1"   
    nameof(C.Method2) -> "Method2"  
    nameof(c.Method1) -> "Method1"   
    nameof(c.Method2) -> "Method2"  
    nameof(z) -> "z" // inside of Method2 ok, inside Method1 is a compiler error  
    nameof(Stuff) = "Stuff"  
    nameof(T) -> "T" // works inside of method but not in attributes on the method  
    nameof(f) -> “f”  
    nameof(f<T>) -> syntax error  
    nameof(f<>) -> syntax error  
    nameof(Method2()) -> error “This expression does not have a name”  
    

    注意! nameof 没有得到底层对象的运行时类型,它只是编译时参数。如果方法接受 IEnumerable,则 nameof 只返回“IEnumerable”,而实际对象可能是“List”。

    【讨论】:

    • nameof 不返回 Type 的名称
    • @NigelTouch 我查过了,nameof 返回了Type 的名字,截图和证明:prntscr.com/irfk2c
    • 对不起,我没有解释清楚。我的意思是它没有得到底层对象的运行时Type,它只是编译时参数。如果方法接受IEnumerable,则nameof 只返回“IEnumerable”,而实际对象可能是“List”。它不认为它回答了 OP 的问题。
    【解决方案3】:

    试试这个来获取泛型类型的类型参数:

    public static string CSharpName(this Type type)
    {
        var sb = new StringBuilder();
        var name = type.Name;
        if (!type.IsGenericType) return name;
        sb.Append(name.Substring(0, name.IndexOf('`')));
        sb.Append("<");
        sb.Append(string.Join(", ", type.GetGenericArguments()
                                        .Select(t => t.CSharpName())));
        sb.Append(">");
        return sb.ToString();
    }
    

    也许不是最好的解决方案(由于递归),但它有效。输出如下:

    Dictionary<String, Object>
    

    【讨论】:

    • 这应该是公认的答案,因为它适当地考虑了可能递归的泛型类型(例如字典)。
    • +1 表示概念。但不喜欢失败的过早优化。它在每个递归调用中创建一个 new StringBuilder(即使是基本情况,当它未使用时),但忽略 string.Join 临时和 LINQ lambda。只需使用String,直到您知道这是一个瓶颈。 /咆哮
    • 奈杰尔,上面说这可能不是最好的解决方案 :)
    • ShortName 是一个较短的名称 :)
    【解决方案4】:

    利用 (Type Properties)

     Name   Gets the name of the current member. (Inherited from MemberInfo.)
     Example : typeof(T).Name;
    

    【讨论】:

      【解决方案5】:
      typeof(T).Name // class name, no namespace
      typeof(T).FullName // namespace and class name
      typeof(T).Namespace // namespace, no class name
      

      【讨论】:

      • Name 不考虑类型参数。
      • this.GetType().Namethis.GetType().FullName等,如果处理实例。
      • Name 也不考虑嵌套类型!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 2017-06-04
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多