我遇到一个想法,即最简单的方法似乎应该起作用。
我试图在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/