获取没有完整名称空间的类型名称


293

我有以下代码:

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

 typeof(T).ToString()

返回全名,包括名称空间

无论如何,是否只有类名(没有任何名称空间限定符?)


7
顺便说一句,写string1 + anything.ToString() + string2是多余的。ToString如果这样做,编译器将自动插入对的调用string1 + anything + string2
蒂姆·罗宾逊

13
听起来不刺耳,但是,您是否检查了Type实例上可用的属性(由返回typeof(..)),我敢肯定您会自己弄清楚的……
Peter Lillevold 2010年

Answers:


530
typeof(T).Name // class name, no namespace
typeof(T).FullName // namespace and class name
typeof(T).Namespace // namespace, no class name

5
Name不考虑类型参数。
gregsdennis

73
this.GetType().Namethis.GetType().FullName等等(如果处理实例)。
avenmore

1
Name也不会考虑嵌套类型!
好战的黑猩猩

33

尝试执行以下操作以获取泛型类型的类型参数:

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>

3
这应该是一个可以接受的答案,因为它适当地考虑了可能递归的通用类型(例如Dictionary <int?,int?>)。
奥的斯

+1的概念。但是不喜欢失败的过早优化。它在每个递归调用中创建一个新的 StringBuilder(甚至是未使用时的基本情况),但忽略了string.Join临时和LINQ lambda。String一直使用直到知道它是瓶颈。/ rant
Nigel Touch

1
奈杰尔(Nigel)说,那可能不是最好的解决方案:)
gregsdennis

ShortName是一个较短的名称:)
Valera,



5

在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”。


3
nameof没有返回Type
Nigel Touch

@NigelTouch我已经检查并nameof返回的名称,并Type提供以下证明的屏幕截图:prntscr.com/irfk2c
Stas Boyarincev

1
不好意思,我说得不好。我的意思是,它没有获得基础对象的运行时Type,而仅仅是编译时参数。如果某个方法接受,IEnumerablenameof只需返回“ IEnumerable”,而实际对象可能是“ List <string>”。它认为它不能回答OP的问题。
Nigel Touch

-2

最佳使用方式:

obj.GetType().BaseType.Name

1
请为您的答案提供一些解释,以使其他用户更加清楚。
Stanislav Mekhonoshin

我曾经发现“ GetType()。Name”只是写在一个虚拟函数中。有人可以向我解释为什么它没有obj.GetType()。BaseType.Name吗?我在学。我了解目的,但不了解所有语法细节。谢谢。
Diego Orellana '18

基本类型与此有什么关系?
约翰尼

我的测试obj.GetType().BaseType.Name返回"TypeInfo"的不是我期望的解决方案。
Nasenbaer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.