获取泛型类的名称,不包括波浪号。

8

我正在尝试使用以下代码获取T的类型名称:

typeof(T).Name

这个类的名字是ConfigSettings

它返回的不是ConfigSettings,而是ConfigSettings`1

这是有原因的吗?如何才能返回没有`1的实际名称呢?


这个类的名称是 ConfigSettings - 不是这个。 - AakashM
3个回答

17
这里有一个扩展方法,可以获取泛型类型的“真实”名称以及泛型类型参数的名称。它会正确处理嵌套的泛型类型。
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>

这真的很不错...我已经把它加入到我的库中了。虽然我不确定什么时候会真正用到它,但只是拥有它的感觉就很好。 ;) - Michael Bray
我不确定从性能角度来看是否值得,但我用sb.Append(string.Join(", ", t.GetGenericArguments().Select(type => type.GetRealTypeName())));替换了你的foreach循环。 - TRex

7

反引号表示该类是一种通用类型。最简单的方法可能就是从反引号开始将其后面的内容全部删除:

string typeName = typeof(T).Name;
if (typeName.Contains('`')) typeName = typeName.Substring(0, typeName.IndexOf("`"));

1
小心嵌套类型! - Trillian
1
这样做不是更简单吗:typeof(T).Name.Split('`')[0];? - user2483744
user2483744,是的,那也可以工作,并且更加简洁,但可能稍微不太清楚它试图做什么。 :) 为您点赞。 - Michael Bray
1
使用嵌套类会使 LastIndexOf 更加安全。 - Fyodor Soikin

3

有什么具体的原因吗?

这意味着该类型只有一个泛型类型参数。

如何返回不带`1`的实际名称?

您可以查找`(如果存在)的索引,并返回类型名称的子字符串,直到该字符为止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接