Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射的泛型列表_C#_Reflection_Generic List - Fatal编程技术网

C# 使用反射的泛型列表

C# 使用反射的泛型列表,c#,reflection,generic-list,C#,Reflection,Generic List,我有一个场景,在这个场景中,我将类名作为字符串,我只想创建该类的通用列表。我尝试了以下方法 Type _type = Type.GetType(className); List<_type> list = new List<_type>(); Type\u Type=Type.GetType(className); 列表=新列表(); 但是我发现了错误。我无法将该类型作为列表参数。如果有人知道,请帮助我不幸的是,这是不

我有一个场景,在这个场景中,我将
类名作为字符串
,我只想创建该类的通用
列表
。我尝试了以下方法

            Type _type = Type.GetType(className);

            List<_type> list = new List<_type>();
Type\u Type=Type.GetType(className);
列表=新列表();

但是我发现了错误。我无法将该类型作为列表参数。如果有人知道,请帮助我

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

编译时检查背后的主要原因是
\u type
可以在运行时更改,然后添加到
列表中会有开销,因为JIT编译器需要进行类型检查


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

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

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

因此,不可能使用反射指定类型参数,因为编译器将不知道有关反射结果的任何信息。

您可以得到:

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

如果您使用的是.Net 4,那么使用
动态
可能会有所帮助。在这种情况下,您将能够在实例上使用无法通过非泛型接口(例如
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});  
Type\u Type=typeof(int);
Type listType=typeof(List).MakeGenericType(_Type);
动态列表=Activator.CreateInstance(listType);
增加第(1)款;
AddRange(新的int[{0,1,2,3});

但是,此方法的类型安全性不如强制转换到非泛型接口,因为它无法在编译时捕获错误。

为什么要这样做?我跟你打赌1000美元,你试图做的事情是愚蠢的,会导致糟糕的设计。这似乎是一个潜在的坏模式。你能提供一些关于这是为了解决什么的细节吗?为什么你的类名以字符串形式出现?这是某种自定义序列化程序的一部分吗?但我只想概括一下这个场景。。。实际上,我需要的是从DataAccess本身返回通用列表。还想泛化该方法。那么您不需要泛型,但可以使用非泛型列表。@如果您不介意,请解释一下好吗?如果该类在另一个类库中,是否可能?只要
\u type
正在引用它。