2012-02-27 13 views
10

私はListとT newitemを指し示すイベントargsを渡すイベントを処理しています。私の仕事は新しいリストをListに追加することです。Tが何であるか知らずにリストTタイプのアイテムをリスト<T>に追加するにはどうすればいいですか?

Tさんが知っているすべてのタイプをチェックせずにこれを行うにはどうすればよいですか?

は、現在のコードは、このカップルの十行です:

private void DataGridCollectionViewSource_CommittingNewItem(object sender, DataGridCommittingNewItemEventArgs e) 
{ 
    Type t = e.CollectionView.SourceCollection.GetType(); 

    if (t == typeof(List<Person>)) 
    { 
    List<Person> source = e.CollectionView.SourceCollection as List<Person>; 
    source.Add(e.Item as Person); 
    } 
    else if (t == typeof(List<Place>)) 
    { 
    List<Place> source = e.CollectionView.SourceCollection as List<Place>; 
    source.Add(e.Item as Place); 
    } 
    ... 

それはこのような何かすることができれば、私は好む:

((List<T>) e.CollectionView.SourceCollection).Add((T)e.Item); 

任意のアイデア?

答えて

16

単にここにジェネリックを使用していない:あなたはまた、IListの代わりにICollectionを使用することができ

IList source = (IList)e.CollectionView.SourceCollection; 
source.Add(e.Item); 

+0

'System.Collections.ICollection' の定義が含まれていません。 「追加」 - 私はこれを最初に投稿しましたが、私はIListを試していませんでした。ありがとう。 – Alain

+0

@Alainああ、十分な公正 - どのメソッドがどのインターフェースにあるのか分からなくなった(iircは非ジェネリック版とジェネリック版の間で少し違いがある) –

+0

サニティチェックとして、SourceCollection e.Itemと同じ型ですか? – Alain

4

ジェネリックコレクションはSystem.Collections名前空間で定義されたオブジェクトベースのインターフェイスを実装するので、あなたがこれを行うことができます:もちろん

((System.Collections.IList) e.CollectionView.SourceCollection).Add(e.Item); 

型チェックは、実行時にシフトしているので、あなたは必ずe.Itemがだろうことを確認する必要がありますコンパイラはキャストの後でそれをチェックすることができないので、正しい型である必要があります。

1

特定の型指定されたクラスを作成できますか?

public class MyClass<ABC> 
    { 
     private void DataGridCollectionViewSource_CommittingNewItem(
       object sender, DataGridCommittingNewItemEventArgs e) 
     { 
      Type t = e.CollectionView.SourceCollection.GetType(); 

     if (t == typeof(List<ABC>)) 
     { 
      List<ABC> source = e.CollectionView.SourceCollection as List<ABC>; 
      source.Add(e.Item as ABC); 
     } 
    } 
} 

かどうか、あなたがやろうと何のコンテキストに応じて....その後

1
void AddItem<T>(IEnumerable sourceCollection, object item) 
{ 
    ((List<T>)sourceCollectio).Add((T)item); 
} 

Type t = e.CollectionView.SourceCollection.GetType(); 
if (t == typeof(List<Person>)) { 
    AddItem<Person>(e.CollectionView.SourceCollection, e.Item); 
} else if (t == typeof(List<Place>)) { 
    AddItem<Place>(e.CollectionView.SourceCollection, e.Item); 
} 
関連する問題