我正在尝试使用以下代码获取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>
sb.Append(string.Join(", ", t.GetGenericArguments().Select(type => type.GetRealTypeName())));
替换了你的foreach
循环。 - TRex反引号表示该类是一种通用类型。最简单的方法可能就是从反引号开始将其后面的内容全部删除:
string typeName = typeof(T).Name;
if (typeName.Contains('`')) typeName = typeName.Substring(0, typeName.IndexOf("`"));
LastIndexOf
更加安全。 - Fyodor Soikin有什么具体的原因吗?
这意味着该类型只有一个泛型类型参数。
如何返回不带`1`的实际名称?
您可以查找`(如果存在)的索引,并返回类型名称的子字符串,直到该字符为止。
ConfigSettings
- 不是这个。 - AakashM