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

本文关键字:包含 特定项 列表 通用项 | 更新日期: 2023-09-27 17:56:44

假设我有三个类看起来像这样:

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,但这似乎不起作用。

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

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

为了访问特定属性,您需要执行强制转换。此外,在执行强制转换时,还应考虑使用 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; 
}

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

((Pear)delicious_things[0]).size

但是,这不是好的设计。请参阅为什么要避免铸造?

您可以

执行以下操作来筛选特定类型:

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

像这样,您确定它将在不投射对象的情况下进行第一Pear

当然,您仍然不确定列表是否至少包含一个类型 Pear 的元素

总是想所有的可能性——>否则一旦将来你会摔倒它