3

简而言之

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

更长

我想调用一个 WPF 窗口,它是一个将绑定到ObservableCollection. 我希望窗口显示两个不同类共有的一些基本信息。这些类是Derived1Derived2,并且基于BaseClass. 我可以调用该方法的类型只是 be 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);
}
4

2 回答 2

2

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

于 2012-09-19T22:41:22.050 回答
1

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

在某些情况下,您可以以类似的方式使用派生类 - 阅读C# 模板的协方差/反方差。即你可以做

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

因为 IEnumerable 将其参数定义为out

 public interface IEnumerable<out T> : IEnumerable
于 2012-09-19T22:43:55.180 回答