如何在运行时创建任意数组类型的实例?
我试图在编译时反序列化未知类型的数组。 在运行时我发现了该类型,但我不知道如何创建实例。
像这样的东西:
Object o = Activator.CreateInstance(type);
这不起作用,因为没有无参数构造函数,Array 似乎没有任何构造函数。
I'm trying to deserialize an array of an type unknown at compile time. At runtime I've discovered the type, but I don't know how to create an instance.
Something like:
Object o = Activator.CreateInstance(type);
which doesn't work because there is no parameterless constructor, Array doesn't seem to have any constructor.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
使用 Array.CreateInstance。
Use Array.CreateInstance.
您可以使用 Array 的 CreateInstance 重载之一,例如:-
You can use one of Array's CreateInstance overloads e.g.:-
相当旧的帖子,但是在回答新问题时,尽管发布了创建多维数组的相关示例。
假设类型 (
elementType
) 为int
和一个二维数组。例如,当它是二维的时,它可以填充为
Quite an old post, but while answering a new question, though of posting a related example of creating a multi-dimensional array.
Assuming the type (
elementType
) asint
and a two-dimensional array for example.When it's two dimensional, for example, it can be populated as
另一种方法是使用表达式树来提高性能。 例如,如果您有数组type,
type
,您可以这样做这只是返回一个空数组。 可能不是很有用。 MSDN 指出
GetConstructors
不保证任何顺序,因此您可能需要一个逻辑来找到具有正确参数的正确构造函数,以便以正确的大小进行实例化。 例如,您可以这样做:使用
Expression.NewArrayBounds
而不是Expression.New
可以更轻松地实现相同的效果,如果您获得的只是数组元素类型,那么它更有效,不是数组类型本身。 演示:如果您传递的是元素类型本身,只需将
type.GetElementType()
更改为type
即可。An alternative is to use expression trees for performance. For e.g. if you have array type,
type
you could doThis just returns an empty array. Probably not very useful. MSDN states
GetConstructors
doesn't guarantee any order, so you might need a logic to find right constructor with right parameters to instantiate with correct size. For e.g. you could do:The same can be achieved much easier with
Expression.NewArrayBounds
instead ofExpression.New
, more over it works if all you got is array element type, not array type itself. Demo:Just change
type.GetElementType()
to simplytype
if what you're passing is element type itself.