获取没有波浪号的泛型类的名称

时间:2013-07-05 04:17:35

标签: c# generics fully-qualified-naming

我试图使用以下方法获取T的类型名称:

typeof(T).Name

班级名称为ConfigSettings

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

有什么具体原因吗?如何在没有`1的情况下返回实际名称?

3 个答案:

答案 0 :(得分:9)

这是一个扩展方法,它将获得泛型类型的“真实”名称以及泛型类型参数的名称。它将正确处理嵌套的泛型类型。

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>

答案 1 :(得分:6)

反向标记表示该类是通用类型。可能最简单的事情就是从后面的前锋中剔除任何东西:

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

答案 2 :(得分:3)

  

有什么具体原因吗?

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

  

如何在没有“1”的情况下返回实际名称?

你可以找到`(如果它存在)的索引,并将类型名称的子字符串返回到该字符。