如何从列表类型中获取模板类型? [复制]

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 的脑袋并知道他想要什么。

以上是关于如何从列表类型中获取模板类型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在可变参数类模板中获取类型的索引?

如何从模板类型中获取指向模板化成员函数的指针?

如何遍历打包的可变参数模板参数列表?

如何从 if 语句中获取类模板的实例? (C++)

如何区分模板类中存储的类型

如何派生抽象模板类,模板类型作为函数参数 (C++11)