C#,通用项目列表,其中包含特定项目

时间:2014-04-03 23:05:57

标签: 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?

如果我已经知道Pear是delicious_things [0],我可以这样做:delicious_things [0] .size,但这似乎不起作用。

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

3 个答案:

答案 0 :(得分:4)

为了访问特定属性,您需要执行强制转换。在执行强制转换时,您应该考虑使用asis运算符。因为如果您尝试从一个不兼容的类型执行强制转换另一个(例如,从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; 
}

答案 1 :(得分:3)

您必须将项目强制转换为特定类型。

((Pear)delicious_things[0]).size

然而,这不是好设计。见Why should casting be avoided?

答案 2 :(得分:2)

您可以采取哪些措施来过滤特定类型:

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

就像那样,你确定它会在没有投射物体的情况下拍摄第一个Pear

当然,您仍然不确定该列表是否至少包含一个Pear

类型的元素

始终考虑所有可能性 - &gt;否则一旦你将来会落在它身上