如何在c#中打印泛型类的名称?

时间:2018-10-30 13:31:16

标签: c# reflection

是否有一种简单的方法来获取c#中包含模板参数的类的名称?

IE

Print( new List<int>{ 100, 1001}); 

产生以下输出之一:

List<int>
List<Int32>
System.Collections.Generics.List<System.Int32>

最好是前2个之一,但是Type.FullName不是可行的选择。太冗长了。

太冗长的结果是不必要的。

System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=235hosehoue5h]]

请注意,我只是在询问是否存在快捷方式。我不要求完全实现这种功能。

1 个答案:

答案 0 :(得分:1)

创建一个获取类Name的方法。

  1. TypeType.IsGenericType中有一个属性,这表示此类型是否为genericType。
  2. 使用Type.GenericTypeArguments获取通用类型的所有参数,并使用linq通过,进行组合。
  3. 如果该类是泛型,则包含泛型,您可以递归使用函数来获取名称。感谢@Eric Lippert指出。

看起来像这样。

public static class ExtensionLib {
    public static string GetClassName(this Type objType)
    {

        string result = objType.Name;
        if (objType.IsGenericType)
        {
            var name = objType.Name.Substring(0, objType.Name.IndexOf('`'));
            var genericTypes = objType.GenericTypeArguments;
            result = $"{name}<{string.Join(",", genericTypes.Select(GetClassName))}>";
        }
        return result;
    }
}

c# online

输入

Console.WriteLine(typeof(List<int>).GetClassName());
Console.WriteLine(typeof(List<List<int>>).GetClassName());  
Console.WriteLine(typeof(Dictionary<List<int>,string>).GetClassName());

结果

List<Int32>
List<List<Int32>>
Dictionary<List<Int32>,String>