有没有办法获得存储在通用列表中的对象类型?

时间:2011-01-20 12:11:43

标签: c# .net generics reflection gettype

给定List<T>类型的通用列表,如何找到类型T

我想如果列表已填充,我可以使用listInstance[0].GetType(),但这似乎有点hackish。

修改

对于上下文,我想使用基于对象属性的列填充DataTable。如果对象属性是通用列表,我想为列表存储的对象的每个属性添加一列。我将在稍后展平数据结构以适应DataRow。

我不想使用列表中第一个对象的类型的原因是因为不能保证每个实例都会填充列表。有些人会,有些则不会,但我仍然需要提前列出所有栏目。

7 个答案:

答案 0 :(得分:7)

你可以尝试

typeof(List<T>).GetGenericArguments()[0]

这适用于空数组,而您的版本不适用。

更新:

在实例上使用

instance.GetType().GetGenericArguments()[0]

答案 1 :(得分:1)

为什么那个hackish?,根本不是hackish。这就是GetType()方法退出的原因。获取对象的类型。

答案 2 :(得分:1)

这是hackish,因为如果没有填充列表,你就无法得到答案。

您需要反映类型:

List<int> mylist = new List<int>();
Type listType = mylist.GetType();
Type genericType = listType.GetGenericArguments()[0];

答案 3 :(得分:1)

您可以使用

 myList.GetType().GetGenericArguments()

返回对象声明中指定的所有类型的数组。

答案 4 :(得分:0)

按照你的说法去做。这不是hackish。

您也可以直接在列表中调用GetType()并使用它来查看其T的类型。

答案 5 :(得分:0)

如果你期待某种类型,并且想要做某事,你也可以listInstance[0] is SomeTypeIExpectThisToBe

答案 6 :(得分:0)

您应该有权访问type参数,因此您可以使用typeof:

void ProcessList<T>( List<T> listInstance)
{
    Type type = typeof(T);
}