0

我希望我的对象能够引用它们所在的集合。

我有一个集合类来自ObservableCollection<>

public class MyObservableCollection<T> : ObservableCollection<T> where T: class, IMyItem

public interface IMyItem
{
   MyObservableCollection<IMyItem> Owner;
}

在其中,我已经覆盖了Insert( )and Remove( ),以便它可以将它自己分配给 上的属性IMyItem,但我不允许这样做,因为

Cannot implicitly convert type 'MyObservableCollection<T>' to
'MyObservableCollection<IMyItem>'

我怎样才能解决这个问题?
可以/应该以完全不同的方式解决问题吗?

插入代码:

    protected override void InsertItem(int index, T item)
    {
        base.InsertItem(index, item);
        item.Owner = this;
    }
4

2 回答 2

1

如果您这样定义界面,它应该可以工作:

public interface IMyItem<T> where T : class, IMyItem<T>
{
    MyObservableCollection<T> Owner { get; set; }
}

public class MyItem : IMyItem<MyItem>
{
    public MyObservableCollection<MyItem> Owner { get; set; }
}

public class MyObservableCollection<T> : ObservableCollection<T> where T : class, IMyItem<T>
{
    protected override void InsertItem ( int index, T item )
    {
        base.InsertItem ( index, item );
        item.Owner = this;
    }
}

用法:

public class MyClass
{
    public static void Main ()
    {
        MyObservableCollection<MyItem> list = new MyObservableCollection<MyItem> ();
        list.Add ( new MyItem () );
    }
}
于 2012-09-03T09:44:29.810 回答
0

假设您有实现接口的 Item 类:

class Item : IMyItem
{
    public MyObservableCollection<IMyItem> Owner;
}

现在,您正在创建一个新集合:

var myCollection = new MyObservableCollection<Item>();
myCollection.Insert(new Item());

现在,在您的Insert()方法中,您正在执行此任务:

newItem.Owner = this;

但你newItem.Owner的类型MyObservableCollection<IMyItem>,而this更具体的类型MyObservableCollection<Item>。您遇到的是泛型covariance/contravariance的问题。Item可能继承自IMyItem,但List<Item>不继承自List<IMyItem>

Stephan Bauer 的回答为您提供了一个解决方法,通过让IMyItem接口对其自身具有通用引用,从而跳过整个协方差问题。一个不同的想法是使用IEnumerable<T>而不是ObservableCollection<T>,因为IEnumerable它被定义为<out T>,这意味着它在继承期间支持协变。

于 2012-09-03T10:07:37.760 回答