2011-01-11 9 views
34

C#(.Net 2.0)の反射型から汎用オブジェクトを作成することはできますか?C#は反映されたタイプのリストをインスタンス化します

void foobar(Type t){ 
    IList<t> newList = new List<t>(); //this doesn't work 
    //... 
} 

タイプtは、実行時まで知られていません。 instanceをどうするか今

void foobar(Type t) 
{ 
    var listType = typeof(List<>); 
    var constructedListType = listType.MakeGenericType(t); 

    var instance = Activator.CreateInstance(constructedListType); 
} 

+0

コンパイル時のタイプがわからないリストではどうしますか? – dtb

+1

'foobar (){IList newList = new List ();のようにこれを汎用関数として書くことができますか? } ' – Juliet

+1

私はこれが悪い方法で大きな問題に取り組んだ結果、これがコードの匂いになるかもしれないと感じました。 –

答えて

102

はこれを試してみてください?

を使用でき
// Now you have a list - it isn't strongly typed but at least you 
// can work with it and use it to some degree. 
var instance = (IList)Activator.CreateInstance(constructedListType); 
+6

'typeof(List <>)'の+1、以前これを見ていなかった。 –

+0

.Netフレームワーク2.0に 'var'が存在しますか? –

+0

@sprocketonline: 'var'はC#3の機能ですので、C#2を使用している場合は、変数を明示的に宣言する必要があります。 –

0

:あなたはあなたのリストの内容の種類を知らないので、あなただけのobject以外の何かを持っていることができるように、おそらくあなたができる最善のことはIListとしてinstanceをキャストすることですそのような操作のためにMakeGenericType

ドキュメントについては、hereおよびhereを参照してください。

6
static void Main(string[] args) 
{ 
    IList list = foobar(typeof(string)); 
    list.Add("foo"); 
    list.Add("bar"); 
    foreach (string s in list) 
    Console.WriteLine(s); 
    Console.ReadKey(); 
} 

private static IList foobar(Type t) 
{ 
    var listType = typeof(List<>); 
    var constructedListType = listType.MakeGenericType(t); 
    var instance = Activator.CreateInstance(constructedListType); 
    return (IList)instance; 
} 
+0

+1は一般的にサポートされていない古いインタフェースを覚えています:) – leppie

関連する問題