4

我有一个场景,Class name as a string我只想创建List该类的泛型。我尝试了以下

            Type _type = Type.GetType(className);

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

但我得到了error。我不能将该 _type 作为列表参数。如果有人知道请帮助我

4

4 回答 4

11

最接近您可以获得:

Type listType = typeof(List<>).MakeGenericType(_type);
IList list = (IList) Activator.CreateInstance(listType);
于 2012-07-16T17:52:15.190 回答
2

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

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

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

于 2012-07-16T17:50:41.977 回答
1

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

例如, usingdynamic允许您调用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});  

但是,这种方法不像强制转换为非泛型接口那样类型安全,因为它无法在编译时捕获错误。

于 2012-07-16T20:33:03.397 回答
0

不幸的是,这是不可能的,因为泛型需要在编译时知道。您正试图通过在运行时使它们为人所知来重新定义这一点。需要在编译时知道它们的原因是编译器可以验证传递给它的所有变量是否有效。AFAIK,做你想做的事需要完全重写泛型。

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

@MarkusJarderot 说的是最接近的,因为使用的是接口而不是泛型。

于 2012-07-16T17:50:06.890 回答