Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# instantiate generic List from reflected Type [duplicate]

Is it possible to create a generic object from a reflected type in C# (.Net 2.0)?

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

The Type, t, is not known until runtime.

like image 741
Iain Sproat Avatar asked Jan 11 '11 18:01

Iain Sproat


2 Answers

Try this:

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

Now what to do with instance? Since you don't know the type of your list's contents, probably the best thing you could do would be to cast instance as an IList so that you could have something other than just an 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); 
like image 72
Andrew Hare Avatar answered Oct 01 '22 20:10

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; } 
like image 31
csauve Avatar answered Oct 01 '22 21:10

csauve