我有三个共同父母的课程。 让我们说父母是动物,孩子是狗,猫和鹦鹉。

我有一个可观察的集合,其中包含用户正在使用的动物集合。 收集包含所有相同类型的动物 - 用户只能与所有狗或所有猫或所有鹦鹉一起工作。

所以我声明了ObservableCollection<Animal>动物,并根据用户选择我想将属性动物的内容更改为ObservableCollection<Dog>ObservableCollection<Cat>ObservableCollection<PArrot> 因此,如果用户目前与狗或猫一起工作并不重要,但他可以选择动物共有的所有动作。

但它不起作用。 似乎我不能将ObservableCollection<Cat>分配给ObservableCollection<animal>类型的Property。 我认为它应该有用,因为动物是猫的超类型,所以我可以像往常一样将猫分配给动物变量。

为什么我不能这样做,我该如何解决这个问题呢?

===============>>#1 票数:5 已采纳

它不起作用的一个原因:如果它确实有效,你可能会有无意义的情况:

ObservableCollection<Animal> animals = new ObservableCollection<Dog>();
animals.Add(new Cat()); // cat is an animal, after all

另一个原因是,它根本就不是的情况下ObservableCollection<Dog> 继承 ObservableCollection<Animal> -它们只是不同(并行)关闭一般类型ObservableCollection<>

什么允许的是,一些接口与“出只有” API(如IEnumerable<T>可以是协变的,所以如果你需要的是迭代它们,你可以有:

IEnumerable<Animal> animals = new ObservableCollection<Dog>();

(大概是狗放在其他地方)

另一种方法是使用非通用API:

IList animals = new ObservableCollection<Dog>();

===============>>#2 票数:1

您不必使用ObservableCollection ,而是必须将这些集合键入IEnumerable<T> ,因为ObservableCollection不支持类型协方差。 没有允许您添加元素的集合将支持这种类型的继承。 要了解原因,请考虑这个假设代码( 编译)

List<object> myObjects = new List<string>();

你认为这样可以,但是看看如果你写下面的内容会发生什么:

myObjects.Add(new Dog());

myObjects被声明为一个对象列表,因此上面的代码将被编译,但是在运行时事情会爆发,因为在myObjectsmyObjects被实例化为只保存字符串。

===============>>#3 票数:0

使其成为一个界面,并使用协方差

interface ObservableCollection <out T>
{

}

===============>>#4 票数:0

如果你不需要,不要用协方差使它过于复杂。 您应该创建ObservableCollection<Animal> ,无论您是否使用Cats,Dogs或Parrots填充它,因为您不使用任何子类功能。

您没有提到为什么使用ObervableCollection,但是如果您没有观察它并且不关心如何通知列表的更改,您也可以转换它。

  ask by translate from so

未解决问题?本站智能推荐:

1回复

任何具有0(1)或O(Logn)复杂度的.net集合,用于查找和删除,添加和插入

我遇到一个非常奇怪的情况,我创建了一个ObservableList类,如下所示 } 我需要HashSet进行快速查找,但是HashSet没有排序的集合,我需要列表,因为我需要引发CollectionChanged事件,但是它需要项索引。 因此,要订购,我必须列出清单,而为了快速查
4回复

C#如何使用另一个集合中的对象替换一个集合中的对象

如何使用Collection2中的匹配对象(按名称和描述)替换Collection1中的对象? 此外,Collection2中匹配操作的对象必须在一定范围内,例如0-20。 Collection2中索引> 20的对象需要附加到Collection1。
3回复

有没有清单 在.NET 2中,当列表更改时引发事件?

我以前使用过ObservableCollection<T> ,但这似乎属于WPF,因此属于.NET 3。 如果没有合适的接口呢? INotifyPropertyChanged似乎不适合集合,而INotifyCollectionChanged仅在.NET 3及更高版本中受支持。
2回复

可观察的集合属性已更改为集合中的项目

我有一个ObservableCollection<T> 。 我已将它绑定到ListBox控件,我已将SortDescriptions到ListBox上的Items集合中,以使列表按我的方式排序。 当任何属性在子元素上发生更改时,我想在任何时候使用列表。 我的所有子元素都
1回复

保存可观察的集合

如何保存IsolatedStorage的小列表和大列表? (“重要:进入BigList需要2个字符串和1个ObservableCollection <>“)。 我们可以看到在类MyFind中有一个ObservableCollection,而在类2中的字符串MyAsk中有
1回复

我应该添加什么对象集合?

我在WPF中使用Prism。 我当时在看Prism入门工具包,它具有ICollectionView。 在该集合中,我需要添加在其中选择的对象。 我应该使用什么对象(或集合)来添加对象? 我的意思是在图像中,我有两个列表框,第一个是只读集合,第二个是可以添加或删除对象的列表。
1回复

C#中的可观察集合更新通知

我正在尝试编写从ObservableCollection继承的Collection,当我的对象更新时,它可能会让我知道。 我知道我们有一个集合更改事件,但只会在添加和删除而不是更新时通知。 因此,EntityBase说,我要做的是从一个通用类继承我所有的工作类(在CustomCollec
2回复

WPF-如何控制可观察的集合更新

在父级中,有一个Observable Collection PendingPayment,其中列出了所有待处理的销售付款以及已支付的列金额。 然后,用户可以选择特定的销售并在新的子窗口中打开它。 出问题的是,如果用户仅在子窗口中编辑文本框支付金额并关闭该窗口而不将新的支付金额保存到数
1回复

我是否意外绑定了两个可观察的集合?

在我的代码中,我有以下两个集合: 昨天,我尝试用listOfJobs1中的对象填充listOfJobs2,我这样做的方式... listOfJobs2 = listOfJobs1; 我注意到,尽管我对listOfJobs1所做的任何更改都反映在listOfJobs2中,即使在
1回复

可观察的自定义集合-自我排序-防止插入等

我有一个自定义类型,它知道如何与他人进行比较(它实现了IComparable),它很好地存储在ObservableList中。 但是,集合中仍然缺少一些东西。 我需要4个功能。 的收藏: 检测重复项并防止插入。 在每次成功插入时自动排序。 是可观察的&