假设我有三个类看起来像这样:
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,但这似乎不起作用。
我错过了什么?提前谢谢!
答案 0 :(得分:4)
为了访问特定属性,您需要执行强制转换。在执行强制转换时,您应该考虑使用as
或is
运算符。因为如果您尝试从一个不兼容的类型执行强制转换另一个(例如,从Apple
到Pear
),您将获得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)
答案 2 :(得分:2)
您可以采取哪些措施来过滤特定类型:
delicious_things.OfType<Pear>().First().size;
就像那样,你确定它会在没有投射物体的情况下拍摄第一个Pear
。
当然,您仍然不确定该列表是否至少包含一个Pear
始终考虑所有可能性 - &gt;否则一旦你将来会落在它身上