2014-04-03 89 views
0

说我有看起来像这样三类:C#,一般项目列表,里面有具体的项目

abstract class Fruit 
{ 
    public string name { get; set; } 
} 

class Apple : Fruit 
{ 
    public int redness { get; set; } 
} 

class Pear : Fruit 
{ 
    public int size { get; set; } 
} 

而且别的地方,我有:

List<Fruit> delicious_things = new List<Fruit>{ 
     new Pear(){} 
     new Apple(){} 
} 

如何访问,如一个来自delicious_things的pear.size的例子?

如果我已经知道梨是delicious_things [0],我可以这样做:delicious_things [0] .size,但似乎并没有工作。

我错过了什么?提前致谢!

+0

考虑各地的接口和统一这样的(或者,因为有子类型,周围的基本类型) - 我认为,不同类型的水果可能是所有具有“色”和“大小“特征。 – user2864740

回答

4

为了访问特定的属性,你需要执行cast.Also如果你试图从一个不兼容的类型进行强制转换为另一种,你应该考虑使用asis运营商进行casts.Because时(为前。从ApplePear)你会得到一个InvalidCastException

var pear = delicious_things[0] as Pear; 
int size; 
if(pear != null) size = pear.size; 

或者:

if(delicious_things[0] is Pear) 
{ 
    int size = ((Pear)delicious_things[0]).size; 
} 
+0

这似乎是唯一的答案,不爆炸,如果你没有梨 – failedprogramming

+0

@failedprogramming - 我认为这是因为问题问'如果我已经知道,梨是delicious_things [0 ]'不管的问题是如何问 –

+0

@Oren,它不会改变的事实,这个答案可以处理一个毫无鸭梨情况。虽然你的答案符合这个问题的参数,但我只是说我个人更喜欢这个,因为它可以实现更多。没有不敬的意图。 – failedprogramming

3

你将不得不项目强制转换为特定类型。

((Pear)delicious_things[0]).size 

但是,这是不好的设计。见Why should casting be avoided?

+0

谢谢! 作为后续:我可以以某种方式看到类型/类的[0]在该列表中? – Eax

+0

您可以设置调试点并检查'delicious_things',它会显示每个项目的具体类型。 –

+0

有没有办法做到这一点,而无需调试? – Eax

2

可以做,以过滤特定类型是什么:

delicious_things.OfType<Pear>().First().size; 

一样,你肯定它去采取先Pear而无需进行转换的对象。

当然,你仍然不知道,如果列表中包含类型的至少一个元素Pear

觉得总是对所有的可能性 - >在今后否则一旦你会爱上了它