我遇到了一个问题,即最简单的看起来应该可行。
我正在尝试在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;}
}
}
答案 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>
}