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
正在引用它。