【发布时间】:2015-12-28 03:19:18
【问题描述】:
我正在开发一个序列化程序,但遇到了多维数组的真实墙。如果我使用Activator.CreateInstance(),它会创建一个一维数组就好了,但是在如下使用时它无法工作:
var indices = new[] { 2, 2 };
Type type = typeof(int[,]);
var result = Activator.CreateInstance(type, indices) as Array;
如果我改用Array.CreateInstance() 来生成我的数组,它同样适用于单维和多维数组。但是,我对数组上用于动态设置值的SetValue() 方法的所有调用都会生成一个异常,而它在我使用Activator.CreateInstance() 创建的一维数组上运行良好。我真的很难找到一个可行的解决方案,它允许我动态创建任何维度/大小的数组,然后用值填充数组。我希望有更多 reflection 经验的人可以对此有所了解。
尝试使用 Activator 创建多维数组时出现异常:
找不到类型“System.Int32[,]”的构造函数。
当我改为使用 Array.CreateInstance() 然后调用 SetValue() 时,我从 SetValue() 调用中得到以下异常:
对象不能存储在这种类型的数组中。
坦率地说,这对我来说毫无意义,因为值是 int 而数组是 int[,]。
我正在为我的项目使用 4.5 框架,尽管我也用 4.6 重新创建了问题。
【问题讨论】:
-
我怀疑
Array.CreateInstance(type, indices)给了你这个错误,因为它没有你期望的类型。调用它实际上会给你一个int[,][,],而不是int[,]。 -
进一步考虑,这可能是an X-Y problem。您能否添加一个示例,说明您的传入数据是什么样的,以及您实际上希望它如何作为对象?例如,如果您的传入数据更像jagged array than a rectangular matrix,那么您可能需要一个非常不同的答案。
-
在这个特定的实例中,我正在编写一个序列化程序,它需要序列化/反序列化任何类型的用户数据(包括多维数组)。问题在于反序列化序列化数据。你确实是对的。看了这么久,我有点狭隘的眼光,一直认为它是 [,] 但在你指出之后我意识到它确实是在返回一个数组数组。
标签: c# .net arrays multidimensional-array reflection