如何实例化List 但T在运行时才知道?
假设我有一个在运行时才知道的类。 在运行时,我得到一个引用类型为x的引用,引用到Foo.GetType()。 只有使用x和List ,才能创建Foo类型的列表吗?
怎么做?
Type x = typeof(Foo); Type listType = typeof(List<>).MakeGenericType(x); object list = Activator.CreateInstance(listType);
当然,您不应期望任何类型安全,因为结果列表在编译时是object
类型。 使用List
会更实用但仍然限制类型安全性,因为Foo
的类型仅在运行时才知道。
你当然可以:
var fooList = Activator .CreateInstance(typeof(List<>) .MakeGenericType(Foo.GetType()));
这里的问题是fooList
是object
类型,所以你仍然必须将它转换为“可用”类型。 但这种类型会是什么样的? 由于支持添加和查找类型为T
List
(或者更确切地说是IList<>
)的对象的数据结构在T
不协变,因此您无法将List
List
转换为List
,其中Foo: IFoo
。 你可以将它转换为在T
协变的IEnumerable
。
如果您使用的是C#4.0,您还可以考虑将fooList
为dynamic
这样您至少可以将其用作列表(例如,添加,查找和删除对象)。
考虑到所有这些以及事实,在运行时创建类型时,您没有任何编译时类型安全性,在这种情况下,简单地使用List
可能是最好/最实用的方法。
像这样的东西:
Activator.CreateInstance(typeof运算(列表<>)。MakeGenericType(类型))
给定一个类型,您可以这样实例化一个新实例:
var obj = Activator.CreateInstance(type);
参考: http : //msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
上述就是C#学习教程:如何实例化List 但T在运行时才知道?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/998460.html