【问题标题】:How do you get the template type from a List Type? [duplicate]如何从列表类型中获取模板类型? [复制]
【发布时间】:2011-02-22 06:21:20
【问题描述】:

我一直在寻找这个。我想知道如何获取传递给创建列表的模板类型。例如。

List<string> listOfStrings = new List<string>();

如何从中获取字符串类型?我知道如何使用类型来获取字段并找到列表类型,但不知道其中的模板。

【问题讨论】:

    标签: c# templates reflection types


    【解决方案1】:

    在这种情况下,你可以这样得到它

    Type genericType = listOfStrings.GetType().GetGenericArguments()[0];
    

    注意,如果你在非泛型类型上尝试这个,它会失败,因为 GetGenericArguments 数组的长度将为 0,但你当然可以采取措施来控制数组的长度。

    【讨论】:

      【解决方案2】:

      您是在谈论获取存储在此列表中的项目类型吗?

      listOfStrings[0].GetType()
      

      将返回类型。

      编辑:

      这是正确的解决方案:

      Type type = listOfStrings.GetType();
      Type itemType = type.GetGenericArguments()[0]; 
      

      【讨论】:

      • 如果列表为空,或者将继承自 T 的类型添加到列表中,这将不起作用
      • 是的,我现在已经编辑了我的答案。
      【解决方案3】:

      但也许他想知道在调用函数时如何获取 T...

      void MyFunc<T>(List<T> list) {
          /// T is the type passed to the List<T>, so for a List<int>, T is int
          T element = default(T);
          list.Add(element);
      }
      

      【讨论】:

      • 我认为他不想使用反射。他只是想以“通用”方式为他的列表创建新元素。我正朝着与其他人“相反”的方向前进。我的回复已经“完整”了,但现在“更完整”了,因为我添加了一个使用示例。
      • 我明白你的意思,但我不认为这是他要问的。请参阅他说How would I get the string type from this? 的问题部分。您无法从任何地方获取类型字符串。我认为这里没有反射的方法。
      • 如果提问者知道如何表达他们想要的东西,世界会容易得多:-) 他们中的许多人就像向程序员询问功能的人(用户)一样迷失了方向。最后,已经有各种使用反射并得到一件事的答案。我给另一件事。没有人可以窥探 OP 的脑袋并知道他想要什么。
      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 2013-07-11
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多