我正在尝试获取T
使用此的类型名称:
typeof(T).Name
班级名称是ConfigSettings
它不是返回ConfigSettings
而是返回ConfigSettings`1
。
有什么具体原因吗?我怎样才能在没有 的情况下返回实际名称`1
?
我正在尝试获取T
使用此的类型名称:
typeof(T).Name
班级名称是ConfigSettings
它不是返回ConfigSettings
而是返回ConfigSettings`1
。
有什么具体原因吗?我怎样才能在没有 的情况下返回实际名称`1
?
这是一个扩展方法,它将获取泛型类型的“真实”名称以及泛型类型参数的名称。它将正确处理嵌套的泛型类型。
public static class MyExtensionMethods
{
public static string GetRealTypeName(this Type t)
{
if (!t.IsGenericType)
return t.Name;
StringBuilder sb = new StringBuilder();
sb.Append(t.Name.Substring(0, t.Name.IndexOf('`')));
sb.Append('<');
bool appendComma = false;
foreach (Type arg in t.GetGenericArguments())
{
if (appendComma) sb.Append(',');
sb.Append(GetRealTypeName(arg));
appendComma = true;
}
sb.Append('>');
return sb.ToString();
}
}
这是一个显示其用法的示例程序:
static void Main(string[] args)
{
Console.WriteLine(typeof(int).GetRealTypeName());
Console.WriteLine(typeof(List<string>).GetRealTypeName());
Console.WriteLine(typeof(long?).GetRealTypeName());
Console.WriteLine(typeof(Dictionary<int, List<string>>).GetRealTypeName());
Console.WriteLine(typeof(Func<List<Dictionary<string, object>>, bool>).GetRealTypeName());
}
这是上述程序的输出:
Int32
List<String>
Nullable<Int64>
Dictionary<Int32,List<String>>
Func<List<Dictionary<String,Object>>,Boolean>
反引号表示该类是泛型类型。可能最简单的事情就是从反勾号中去掉任何东西:
string typeName = typeof(T).Name;
if (typeName.Contains('`')) typeName = typeName.Substring(0, typeName.IndexOf("`"));
有什么具体原因吗?
这意味着该类型有一个泛型类型参数。
如何在没有“`1”的情况下返回实际名称?
您可以找到 ` 的索引(如果存在)并返回类型名称的子字符串直到该字符。