泛型列表通过使用反射(Generic list by using reflection)

2019-06-26 08:10发布

我有,我有一个场景Class name as a string我只是想创建一个通用的List这个类的。 我尝试以下

            Type _type = Type.GetType(className);

            List<_type> list = new List<_type>();

但IAM葛亭error 。 我不能给那_type为列表参数。 如果有人知道,请帮助我

Answer 1:

最近你可以得到:

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


Answer 2:

反映在运行时发生,作为一个对象的类型可以通过正在运行的程序可以改变任何东西。

型参数(泛型),而另一方面,仅用于由编译器,以检查类型安全。

所以这是不可能使用反射指定类型的参数,因为编译器不知道反思的结果什么。



Answer 3:

如果您使用的是.NET 4,然后使用dynamic可能会有帮助。 在这种情况下,你将能够使用的实例不是通过非通用接口(如访问的方法IList )。

例如,使用dynamic允许你调用AddRanges列表,你可以不通过投做的方法IList

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});  

然而,这种方法是不是尽可能接近类型安全的铸造到非通用接口,因为它无法赶上在编译时错误。



Answer 4:

不幸的是,这是不可能的,因为仿制药需要在编译时是已知的。 您正在试图使它们在运行时已知重新定义此。 他们需要在编译时知道的原因是为了让编译器可以验证传递给它的所有变量都有效。 据我所知,做你想要去的需要仿制药完全重写的。

主要的原因后面编译时检查是_type可以在运行时改变,那么就在增加了在头顶List<T>作为JIT编译器需要做的类型检查。

什么@MarkusJarderot说的是,你可以得到的接口来代替泛型最接近的一次。



文章来源: Generic list by using reflection