2012-01-23 5 views
3

私はリストのリストを持ち、それぞれのリストは異なるクラスのオブジェクトを保持しています。正しいリストに要素を追加するには、リストの種類を見つける必要があります。私は現在、この方法でそれを達成しようとしています:リストのタイプを取得<T>オブジェクトから

 foreach(object o in DataBase) 
     { 
      Type t = o.GetType(); 
      if (t != typeof(T)) 
       continue; 
      else 
      { 
       List<T> L = (List<T>)o; 
       L.Add(element); 
       break; 
      } 
     } 

はしかし、これはSystem.Collections.Generic.List`1 [[MYTYPE、などなど]]のリストタイプを返します。 適切な比較のために、リストの型から 'myType'を抽出する方法はありますか?

+3

: –

+0

これはおそらく、私はちょうど反射を学び始めたばかりです。私は提案に開いています。 – 3Pi

答えて

6

使用GetGenericArguments方法:myListTypeは正確に一つの型パラメータを持つジェネリック型のインスタンスであるため

Type listTypeParam = myListType.GetGenericArguments()[0]; 

は、タイプTは、返された配列の0番目の位置に戻されます。問題の真の解決策のように見える恐ろしい

foreach(object o in DataBase) 
    if (o is List<T>) 
    { 
     (o as List<T>).Add(element) 
     break; 
    } 
+0

ありがとう、ちょうど私が探していたもの。 GetGenericArguments()には他にどのような情報が含まれていますか? – 3Pi

+1

'GetGenericArguments'はジェネリック型に渡されるパラメータの配列を返します。配列内の要素の数は、型パラメータの数と同じです: 'List 'の場合は常に1です。 'Dictionary 'は常に2であり、以下同様です。 – dasblinkenlight

3

明示的にジェネリック引数の型をチェックしないで、あなたは上記のようにコードをリファクタリングすることができるかもしれません。
+0

これはとてもうまく動作します! – 3Pi

関連する問題