如何为派生类调用方法?

时间:2012-09-19 22:36:51

标签: c# wpf observablecollection base derived-class

简而言之

我希望能够调用方法,该方法采用ObservableCollection<Base>类型的参数,但我想用ObservableCollection<Derived>调用它。它说它不能在两者之间转换。

我想调用WPF窗口,它是一个将绑定到ObservableCollection的ListBox。我希望窗口显示两个不同类共有的一些基本信息。这些课程为Derived1Derived2,基于BaseClass。我可以调用刚才BaseClass类型的方法,但我希望传递一个列表。

所以我有两个系列:

ObservableCollection<Derived1> A;
ObservableCollection<Derived2> B;

并希望能够使用上述两个集合调用类似下面的方法,因此我不需要重复代码。

public void InitialiseWindow(ref ObservableCollection<BaseClass> List)
{
    this.List=List;
}

但它引发了一个错误:

cannot convert from 'ref System.Collections.ObjectModel.ObservableCollection<Derived1>' to 'ref System.Collections.ObjectModel.ObservableCollection<Base>'

虽然我在这里

是否有更好的方法来绑定集合,因此Window中所做的更改将反映在源代码上,而不是使用ref

解决方案

我修改了Window的构造函数,以便将IEnumerable强制转换为ObservableCollection类型的公共成员。由于窗口只能以模态方式显示,因此可以在窗口关闭后访问该成员。

public ObservableCollection<BaseClass> List;

public InitialiseWindow(IEnumerable<BaseClass> List)
{
    InitializeComponent();
    this.List=new ObservableCollection<BaseClass>(List);
}

2 个答案:

答案 0 :(得分:2)

如果您纯粹出于绑定目的而公开它,那么传递IEnumerable<BaseClass>引用就足够了。数据绑定系统将自动检查实际实例以查看它是否实现INotifyCollectionChanged,因此不需要将绑定属性明确键入为ObservableCollection

答案 1 :(得分:1)

类型不同,ref类型必须完全匹配。

有些情况下,您可以以类似的方式使用派生类 - 请阅读co-variance/contra-variance for C# templates。即你可以做到

IEnumerable<Object> objects = new List<String>();

因为IEnumerable将其参数定义为out

 public interface IEnumerable<out T> : IEnumerable