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

我有以下代码:

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

 typeof(T).ToString()

返回包括命名空间在内的全名

是否有方法只获取类名(没有任何名称空间限定符?)

210817 次浏览
typeof(T).Name // class name, no namespace
typeof(T).FullName // namespace and class name
typeof(T).Namespace // namespace, no class name

利用(类型属性)

 Name   Gets the name of the current member. (Inherited from MemberInfo.)
Example : typeof(T).Name;
你可以这样做:
typeof(T).Name;

尝试获取泛型类型的类型参数:

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>

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