获取没有任何泛型信息的类型名称

All*_*est 20 .net c# generics reflection

如果我写:

var type = typeof(List<string>);
Console.WriteLine(type.Name);
Run Code Online (Sandbox Code Playgroud)

它会写:

List`1

我想要它只写:

名单

我怎样才能做到这一点?有没有更聪明的方法来做到这一点,而不必使用Substring或类似的字符串操作功能?

Jon*_*eet 31

不,它在名称中包含泛型arity是完全合理的 - 因为它是使名称唯一的一部分(当然还有程序集和命名空间).

这样说吧:System.Nullable并且System.Nullable<T>是非常不同的类型.你不希望混淆两者......所以如果你丢失信息,你将不得不努力去做.当然,这并不是很难,可以放入辅助方法:

public static string GetNameWithoutGenericArity(this Type t)
{
    string name = t.Name;
    int index = name.IndexOf('`');
    return index == -1 ? name : name.Substring(0, index);
}
Run Code Online (Sandbox Code Playgroud)

然后:

var type = typeof(List<string>);
Console.WriteLine(type.GetNameWithoutGenericArity());
Run Code Online (Sandbox Code Playgroud)

  • 一个实际用例是从通用域对象自动转换为通常不支持泛型的 DTO。 (2认同)