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

假设在C#中,
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)
,你就有了你的解决方案。显然,您必须去掉第三行中的强制转换,然后使用反射来处理创建的列表-如果您在编译时不知道类型,则没有其他方法。我更新了我的答案。这就是我在发帖前没有校对的原因。看起来这对我来说很有用。。。谢谢你,安迪,也谢谢大家。