使用子类T </t>重载父属性的BindingList <t>

时间:2009-03-09 01:55:46

标签: c# oop

我遇到了一个问题,即最简单的看起来应该可行。

我正在尝试在BindingList<T> BindingList的子类中重载<subclasss T>类型的属性。我可以通过各种方式解决这个问题,但似乎“最好”的方式是没有任何直接投射。我已经尝试了一些选项并有一些解决方案,但我对它们中的任何一个都不是特别满意。

有最佳方法吗? 简单代码示例可能是最佳描述符 在下面的这个例子中,我想派生一个fruitbowl只包含苹果但使用相同的属性名来访问这个BindingList<>的Apples(在子类的情况下;在Super类的情况下是泛型水果)。

--------例-------

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;}
  }
}

2 个答案:

答案 0 :(得分:2)

您尝试做的事情称为Co / Contra Variance。不幸的是,C#中的具体类型不支持此功能(仅适用于C#4.0的接口)。给定BindingList&lt; T&gt;的实现。它不可能做你想要的,只维护一个列表。

您可以尝试以多种方式伪造它。解决此问题的一种方法是仅使用IEnumerable&lt; T&gt;。在子类上。在这种情况下,简单的LINQ查询就可以解决问题。

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

答案 1 :(得分:1)

class FruitBowl<T> where T : Fruit //this requires T to inherit from Fruit
{
    protected BindingList<T> Fruits;
}

class AppleBowl : FruitBowl<Apple>
{
    //AppleBowl will have an inherited property Fruits 
    //of type BindingList<Apple>
}