使用reflection的通用列表

我有一个场景,我将Class name as a string我只想创建该类的通用List 。 我尝试了以下内容

  Type _type = Type.GetType(className); List list = new List(); 

但是我觉得error 。 我不能把那个_type作为列表参数。 如果有人知道请帮助我

最近的你可以得到:

 Type listType = typeof(List<>).MakeGenericType(_type); IList list = (IList) Activator.CreateInstance(listType); 

reflection发生在运行时,因为对象的类型可以通过正在运行的程序更改为任何对象。

另一方面,类型参数(generics)仅由编译器使用,以检查类型安全性。

所以不可能使用reflection指定一个类型参数,因为编译器不会知道有关reflection结果的任何信息。

如果您使用的是.Net 4,那么使用dynamic可能有所帮助。 在这种情况下,您将能够在实例上使用无法通过非generics接口(例如IList )访问的方法。

例如,使用dynamic允许您调用列表的AddRanges方法,这是通过AddRangesIList无法完成的:

 Type _type = typeof(int); Type listType = typeof(List<>).MakeGenericType(_type); dynamic list = Activator.CreateInstance(listType); list.Add(1); list.AddRange(new int[] {0, 1, 2, 3}); 

但是,此方法并不像转换为非generics接口那样类型安全,因为它无法在编译时捕获错误。

不幸的是,这是不可能的,因为在编译时需要知道generics。 您试图通过在运行时将它们公开来重新定义它。 它们需要在编译时知道的原因是编译器可以validation传递给它的所有变量是否有效。 AFAIK,做你想做的事情需要完全重写generics。

编译时检查的主要原因是_type可以在运行时更改,然后添加到List会有开销,因为JIT编译器需要进行类型检查。

@MarkusJarderot所说的是最接近你使用的接口而不是generics。