C# 如何实例化列表<;T>;但T在运行时之前是未知的?
假设我有一个在运行时之前未知的类。 在运行时,我得到一个引用Foo.GetType()类型的引用x。 只有使用x和List,才能创建Foo类型的列表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
如何做到这一点?给定类型,可以通过以下方式实例化新实例:
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()));