0

オブジェクトが存在するコレクションへの参照をオブジェクトに持たせたい.

私はから派生したコレクションクラスを持っていますObservableCollection<>:

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

public interface IMyItem
{
   MyObservableCollection<IMyItem> Owner;
}

Insert( )その中で、 andをオーバーライドしてRemove( )、それ自体を on のプロパティに割り当てることができるようにしましたが、その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;

しかし、 yournewItem.Ownerは typeMyObservableCollection<IMyItem>であり、 whilethisはより具体的な typeMyObservableCollection<Item>です。あなたが遭遇しているのは、一般的な共分散/反分散の問題です。Itemから継承する可能性がありますIMyItemが、からList<Item>継承しませんList<IMyItem>

Stephan Bauer's answer は、IMyItemインターフェイスにそれ自体への一般的な参照を持たせることで、共分散の問題全体をスキップすることで、これに対する回避策を提供します。別の考え方として、IEnumerable<T>の代わりにを使用するというものがあります。これはObservableCollection<T>IEnumerableが として定義されているためです<out T>。これは、継承時の共分散をサポートすることを意味します。

于 2012-09-03T10:07:37.760 に答える