我正在使用一个序列化程序,并且遇到了一个带有多维数组的真实墙。如果我使用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重新创建了问题。
答案 0 :(得分:3)
在这种情况下,您可以使用实际Array.CreateInstance
ElementType
来呼叫int
。
var indices = new[] { 2, 3 };
var arr = Array.CreateInstance(typeof(int), indices);
然后您可以使用SetValue
填充数组,没有任何异常。例如
var value = 1;
for (int i = 0; i < indices[0]; i++)
{
for (int j = 0; j < indices[1]; j++)
{
arr.SetValue(value++, new[] { i, j });
}
}
//arr = [ [ 1, 2, 3 ], [ 4, 5, 6 ] ]