如何动态生成和填充多维数组

时间:2015-12-28 03:19:18

标签: c# .net arrays multidimensional-array reflection

我正在使用一个序列化程序,并且遇到了一个带有多维数组的真实墙。如果我使用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重新创建了问题。

1 个答案:

答案 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 ] ]