C# 如何实例化列表<;T>;但T在运行时之前是未知的?

C# 如何实例化列表<;T>;但T在运行时之前是未知的?,c#,C#,假设我有一个在运行时之前未知的类。 在运行时,我得到一个引用Foo.GetType()类型的引用x。 只有使用x和List,才能创建Foo类型的列表 如何做到这一点?给定类型,可以通过以下方式实例化新实例: var obj = Activator.CreateInstance(type); 参考:Type x=typeof(Foo); Type listType=typeof(List).MakeGenericType(x); 对象列表=Activator.CreateInstance(lis

假设我有一个在运行时之前未知的类。 在运行时,我得到一个引用Foo.GetType()类型的引用x。 只有使用x和List,才能创建Foo类型的列表


如何做到这一点?

给定类型,可以通过以下方式实例化新实例:

var obj = Activator.CreateInstance(type);
参考:

Type x=typeof(Foo);
Type listType=typeof(List).MakeGenericType(x);
对象列表=Activator.CreateInstance(listType);
当然,您不应该期望这里有任何类型安全性,因为生成的列表在编译时是类型
object
。使用
List
会更实用,但仍然会限制类型安全性,因为
Foo
的类型只有在运行时才知道。

类似以下内容:

Activator.CreateInstance(typeof(List).MakeGenericType(type))

确定您可以:

var fooList = Activator
    .CreateInstance(typeof(List<>)
    .MakeGenericType(Foo.GetType()));
var-dublist=Activator
.CreateInstance(类型)(列表)
.MakeGenericType(Foo.GetType());
这里的问题是,
dublist
属于
object
类型,因此您仍然必须将其转换为“可用”类型。但是这种类型看起来会是什么样子呢?由于支持添加和查找类型为
T
List
(或者更确切地说是
IList
)的对象的数据结构在
T
中不协变,因此不能将
列表
强制转换为
列表
,其中
Foo:IFoo
。您可以将其强制转换为
IEnumerable
,它在
T
中是协变的

如果你使用的是C 4,你也可以考虑将代码< >傻瓜> <代码> >代码>动态< /代码>,这样你至少可以使用它作为一个列表(例如,添加、查找和删除对象)。


考虑到所有这一切,以及在运行时创建类型时没有任何编译时类型安全性这一事实,在这种情况下,简单地使用
列表
可能是最好的/最实用的方法。

任何阻止您简单地创建
列表
,让我看看你是怎么做到的然后,如何建立列表?很好!您的回答还(正确地)表明,使用这样的列表是非常不安全的。当然,可以将
list
声明为(非泛型)类型
IList
ICollection
(而不仅仅是
object
),并附带相应的
Activator.CreateInstance
返回值转换,这样就可以以有限的方式将
列表
用作集合。如果您在运行时创建类型,请确保不存在任何编译时类型安全性。
var fooList = Activator
    .CreateInstance(typeof(List<>)
    .MakeGenericType(Foo.GetType()));