C# 从声明了超类类型的列表中获取列表类型

C# 从声明了超类类型的列表中获取列表类型,c#,reflection,C#,Reflection,我有三个类(动物、哺乳动物和爬行动物),其中哺乳动物和爬行动物是动物的亚类 我有一个动物的名单,我只居住哺乳动物或爬行动物。我想在运行时获取列表中的类型 使用列表本身不起作用 Type type = myList.GetType().GetProperty("Item").PropertyType; // type -> Animal Type type = myList.GetType().GetGenericArguments()[0]; // type -> Animal

我有三个类(动物、哺乳动物和爬行动物),其中哺乳动物和爬行动物是动物的亚类

我有一个动物的名单,我只居住哺乳动物或爬行动物。我想在运行时获取列表中的类型

使用列表本身不起作用

Type type = myList.GetType().GetProperty("Item").PropertyType;
// type -> Animal

Type type = myList.GetType().GetGenericArguments()[0];
// type -> Animal

这个列表也是另一个类的属性,我们称之为Biome。生物群落有两个属性,爬行动物(列表)和哺乳动物(列表)。给定集合属性的实例,我可以找到项目类型吗?

获取列表中项目的类型,而不是列表的类型:

Type type = myList[0].GetType();

如果您使用的是.NET 4.0并且在创建列表时知道元素的类型,则可以按如下方式应用:

List<Animal> myList = new List<Reptile>();
List myList=new List();

这将使用反射生成适当的输出。

您也可以显示列表定义吗?看起来您正在做列表。请您提供完整的代码示例,准确显示您正在尝试完成的任务,包括所有涉及的数据类型?你可以把它们剥去,伪造你的类型,只要它显示出你在努力完成什么。按照您提出问题的方式,我无法告诉您a)涉及哪些元素类型,或者b)您使用的是什么列表类型。这有时会起作用,但取决于OP对该类型的需要。这只在列表不是空的情况下才有效。@Merlyn Morgan Graham:是的,这假设列表中至少有一项。如果列表中没有任何项,则列表中的项根本没有任何类型。如果它是
ArrayList
(.Net 1.1),则为真。如果它是一个
列表
,则它有一个元素类型。但他说的是超级班,所以也许你是对的。问这个问题的方式令人困惑…@Merlyn Morgan Graham:列表有元素类型
Animal
,这是列表中项目的基类,op想要列表中项目的实际类型。不,你不能。即使在C#4中,方差也不能应用于具体类型,如
List