我遇到一个想法,即最简单的方法似乎应该起作用。

我试图在BindingList<T>BindingList的子类中重载类型为<subclasss T>的属性。我有很多方法可以解决这个问题,但是似乎“最好的”方法是没有任何直接的方法。我尝试了很多选择并提供了一些解决方案,但是我对其中任何一个都不满意。

是否有最佳方法?一个简单的代码示例可能是最好的描述符
在下面的示例中,我想派生一个只包含苹果的果盘,但是使用相同的属性名称来访问此BindingList<>苹果(对于子类而言;对于超级类而言则是通用水果)。

- - - - 例 - - - -

class Fruit{}
class Apple: Fruit {}

class FruitBowl
{
  protected BindingList<Fruit>  m_aFruits;

  public BindingList<Fruit> Fruits
  {
    get {return m_aFruits;}
  }
}

class AppleBowl : FruitBowl
{
  public BindingList<Apple> Fruits
  {
    get {return m_aFruits;}
  }
}

最佳答案

您尝试执行的操作称为Co / Contra Variance。不幸的是,这在C#中的具体类型上不受支持(仅在C#4.0的接口上可用)。给定BindingList 的实现,就不可能做您想做的事情并仅维护一个列表。

您可以尝试通过多种方式伪造此内容。解决此问题的一种方法是仅在子类上使用IEnumerable 。在这种情况下,简单的LINQ查询即可解决问题。

class AppleBowl : FruitBowl
{
  public IEnumerableApple> TypedFruits
  {
    get {return base.Fruits.Cast<Apple>();}
  }
}

关于c# - 使用T的子类重载父属性的BindingList <T>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/624763/

10-10 21:57