web-dev-qa-db-ja.com

C#は、反映された型からジェネリックリストをインスタンス化します

C#(.Net 2.0)のリフレクトされた型からジェネリックオブジェクトを作成することは可能ですか?

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

タイプtは、実行時まで不明です。

39
Iain Sproat

これを試して:

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

    var instance = Activator.CreateInstance(constructedListType);
}

instanceをどうするか?リストの内容のタイプがわからないので、おそらくあなたができる最善の方法は、instanceIListとしてキャストして、単にobject

// 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);
120
Andrew Hare
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;
}
6
csauve

このような操作にはMakeGenericTypeを使用できます。

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

0
Ilya Kogan