我希望能够调用方法,该方法采用ObservableCollection<Base>
类型的参数,但我想用ObservableCollection<Derived>
调用它。它说它不能在两者之间转换。
我想调用WPF窗口,它是一个将绑定到ObservableCollection
的ListBox。我希望窗口显示两个不同类共有的一些基本信息。这些课程为Derived1
和Derived2
,基于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);
}
答案 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