如何实例化List 但T在运行时才知道?

假设我有一个在运行时才知道的类。 在运行时,我得到一个引用类型为x的引用,引用到Foo.GetType()。 只有使用x和List ,才能创建Foo类型的列表吗?

怎么做?

 Type x = typeof(Foo); Type listType = typeof(List<>).MakeGenericType(x); object list = Activator.CreateInstance(listType); 

当然,您不应期望任何类型安全,因为结果列表在编译时是object类型。 使用List会更实用但仍然限制类型安全性,因为Foo的类型仅在运行时才知道。

你当然可以:

 var fooList = Activator .CreateInstance(typeof(List<>) .MakeGenericType(Foo.GetType())); 

这里的问题是fooListobject类型,所以你仍然必须将它转换为“可用”类型。 但这种类型会是什么样的? 由于支持添加和查找类型为T List (或者更确切地说是IList<> )的对象的数据结构在T不协变,因此您无法将List List转换为List ,其中Foo: IFoo 。 你可以将它转换为在T协变的IEnumerable

如果您使用的是C#4.0,您还可以考虑将fooListdynamic这样您至少可以将其用作列表(例如,添加,查找和删除对象)。

考虑到所有这些以及事实,在运行时创建类型时,您没有任何编译时类型安全性,在这种情况下,简单地使用List可能是最好/最实用的方法。

像这样的东西:

Activator.CreateInstance(typeof运算(列表<>)。MakeGenericType(类型))

给定一个类型,您可以这样实例化一个新实例:

 var obj = Activator.CreateInstance(type); 

参考: http : //msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx