【问题标题】:How do I print the name of generic classes in c#? [duplicate]如何在 C# 中打印泛型类的名称? [复制]
【发布时间】:2018-10-31 02:30:09
【问题描述】:

有没有一种简单的方法可以在c#中获取包含模板参数的类的名称?

I.E

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]]

请注意,如果存在快捷方式,我只需要它。我不是要求完全实现此类功能。

【问题讨论】:

  • 这些不是“模板参数”,这些是“通用类型参数”。它们不一样。 C# 中的泛型与 C++ 中的模板不同。
  • Console.WriteLine(typeof(List&lt;int&gt;)) 产生System.Collections.Generic.List'1[System.Int32]。这有什么问题?
  • 缺少尖括号,不利于嵌套模板类型的可读性 => System.Console.WriteLine(typeof(List&lt;Tuple&lt;List&lt;int&gt;,List&lt;char&gt;&gt;&gt;)); 打印 System.Collections.Generic.List'1[System.Tuple'2[System.Collections.Generic.List'1[System.Int32],System.Collections.Generic.List'1[System.Char]]]
  • How about this?。也许不是我所说的“简单”......
  • @UberFace 没有任何遗漏,这只是反射符号。也许值得问一下你想用这些字符串做什么?例如,出于调试原因,这无关紧要。

标签: c# reflection


【解决方案1】:

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

  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>

【讨论】:

  • 你很接近但不太对。如果您的程序中有List&lt;List&lt;int&gt;&gt;,会发生什么?你知道如何解决它吗?
  • @EricLippert 很好。我编辑我的答案使用递归函数
  • 您的修复工作有效,但它是不必要的复杂。递归调用已经检查了泛型,所以你可以说genericTypes.Select(x =&gt; x.GetClassName())。事实上,你可以让它比这更短。你可以简单地说genericTypes.Select(GetClassName),C# 就会明白你的意思。
  • @EricLippert 哇谢谢新的学习。你太棒了。我可以在我的回答中使用你的想法吗:)
  • 当然,加油!
猜你喜欢
  • 1970-01-01
  • 2021-11-26
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
相关资源
最近更新 更多