C#实例化反映types的generics列表
是否有可能从C#(.Net 2.0)中的reflectiontypes创build一个通用的对象?
void foobar(Type t){ IList<t> newList = new List<t>(); //this doesn't work //... }
typest在运行时才是已知的。
尝试这个:
void foobar(Type t) { var listType = typeof(List<>); var constructedListType = listType.MakeGenericType(t); var instance = Activator.CreateInstance(constructedListType); }
现在该如何处理instance
? 由于您不知道列表内容的types,因此您可以做的最好的事情就是将instance
作为IList
进行投放,以便您可以拥有除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);
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; }
您可以使用MakeGenericType
进行此类操作。
有关文档,请参阅这里和这里 。