3

要するに

メソッドを呼び出せるようにしたいのですが、メソッドは型のパラメーターを取りますが、でObservableCollection<Base>呼び出したいのですObservableCollection<Derived>。2つの間で変換できないと書かれています。

より長いです

WPFウィンドウを呼び出したいのですが、その中にはにバインドするリストボックスがありObservableCollectionます。2つの異なるクラスに共通するいくつかの基本情報をウィンドウに表示したいと思います。クラスはとでDerived1ありDerived2、に基づいていBaseClassます。タイプがちょうどだったメソッドを呼び出すことができますがBaseClass、リストを渡したいです。

だから私は2つのコレクションを持っています:

ObservableCollection<Derived1> A;
ObservableCollection<Derived2> B;

そして、上記の2つのコレクションを使用して、以下のようなメソッドを呼び出せるようにしたいので、コードを複製する必要はありません。

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キャストするようにしました。ウィンドウはモーダルでのみ表示されるため、ウィンドウを閉じた後にこのメンバーにアクセスできます。IEnumerableObservableCollection

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 に答える