2011-07-08 169 views
0

我有三个类(Animal,Mammal和Reptile),其中Mammal和Reptile是Animal的子类。从超类的声明类型列表中获取列表类型

我有一个动物列表,我只填充了哺乳动物或只有爬行动物。我想在运行时在列表中获取类型。

使用列表本身不起作用。

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

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

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

+1

你能否显示你的列表定义?看起来像你在做什么List sgtz

+0

你能给出完整的代码示例,显示你正在尝试完成什么,包括所有的数据类型?只要它显示你想要完成的事情,你就可以将它们剥离并伪造你的类型。用你问这个问题的方式,我不能告诉a)涉及哪些元素类型,或者b)你使用的是什么列表类型。 –

回答

2

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

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

这有时可以工作,但取决于OP需要处理的类型。这只有在列表不为空时才有效。 –

+0

@Merlyn Morgan-Graham:是的,这里假定列表中至少有一个项目。如果列表中没有任何项目,则列表中的项目根本没有任何类型。 – Guffa

+0

如果它是一个'ArrayList'(.Net 1.1),这是真的。如果它是'List ',那么它有一个元素类型。但他在谈论超级班,所以也许你是对的。提问的方式令人困惑...... –

0

如果您使用的是.NET 4.0和知道元素的类型,当你创建列表即可应用Generic Covariance如下:

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

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

+0

不,你不能。即使在C#4中,“方差”也不能应用于'List '等具体类型。 – LukeH