C#:实例化一个列表,给定一个类型的引用
假设在C#中,C#:实例化一个列表,给定一个类型的引用,c#,list,C#,List,假设在C#中,myType是对某个类型的引用。 仅使用myType是否可以创建myType对象的列表 例如,在下面的代码中,虽然它是错误的,但我想通过 新列表() using System ; using System.Reflection ; using System.Collections.Generic ; class MyClass { } class MainClass { public static void Main ( string [] a
myType
是对某个类型的引用。
仅使用myType
是否可以创建myType
对象的列表
例如,在下面的代码中,虽然它是错误的,但我想通过
新列表
()
using System ;
using System.Reflection ;
using System.Collections.Generic ;
class MyClass
{
}
class MainClass
{
public static void Main ( string [] args )
{
Type myType = typeof ( MyClass ) ;
List < myType > myList = new List < myType > ( ) ;
}
}
使用系统;
运用系统反思;
使用System.Collections.Generic;
类MyClass
{
}
类主类
{
公共静态void Main(字符串[]args)
{
类型myType=typeof(MyClass);
列表myList=新列表();
}
}
您可以使用反射来执行此操作:
Type typeList = typeof(List<>);
Type actualType = typeList.MakeGenericType(myType);
object obj = Activator.CreateInstance(actualType);
Type typeList=typeof(List);
类型actualType=typeList.MakeGenericType(myType);
object obj=Activator.CreateInstance(actualType);
是否有使用的理由
列表'
而不是
列表`
本质上,您的代码希望将在编译时类型未知的对象存储在集合(列表)中
我想说的是,如果您计划生成此生产代码,请使用List或使用继承并存储基类列表。这是不可能的,因为编译时不知道myType
,并且您无法在代码中操作此列表。您可以使用反射来创建数组。您可以使用反射,但由于在编译时不知道返回列表的类型,因此使用返回列表的代码必须通过松散类型的接口访问成员
与仅仅使用列表相比,这不会产生更快或可维护的代码
更好的解决方案是创建一个列表,其中包含运行时可以放入列表中的所有类型的最强公共接口或基类。至少这样,在处理列表成员时,您不必来回转换对象,而且您将在编译时对列表中的内容进行验证。代码中有一个更明显的错误:list=new list();需要是:List myList=new List();事实上,我想你这里有一个小错误。您正在创建列表的实例,所以应该强制转换为var obj=(List)Activator.CreateInstance(actualType);这个建议的解决方案是指“MyClass”--我想实现这个解决方案而不是指“MyClass”,而是只使用“myType”。用myType
替换typeof(MyClass)
,你就有了你的解决方案。显然,您必须去掉第三行中的强制转换,然后使用反射来处理创建的列表-如果您在编译时不知道类型,则没有其他方法。我更新了我的答案。这就是我在发帖前没有校对的原因。看起来这对我来说很有用。。。谢谢你,安迪,也谢谢大家。