C#:有没有办法使用反射来调整未知类型的数组?

时间:2011-01-21 14:43:36

标签: c# arrays reflection resize

我的用户传给我一些类型的数组,比如int []或string []。我可以通过GetElementType轻松查询元素的类型,我可以通过GetRank,GetLength等找到数组传递给我的时间。

数组在params列表中传递,因此可视化代码如下:

    public void Resizer(params object[] objs)
    {
        foreach (object o in objs)
            Array.Resize(ref o, 3);
    }

我想要做的是与可用的Get方法相反并且确实有效:我想调整传递给我的数组的大小,将长度设置为其他长度(如这个愚蠢的例子中的3) )。

我这样做是因为在我的设置中,数组将包含从一组云计算服务器接收的数据,我们无法知道有多少人会提前响应,因此无法预先分配数组以获得正确的长度。理想情况下,实际上,我的用户传入一个长度为0的数组,然后传回一个长度为n的数组,表示我从查询服务器获得了n个回复。

我无法使用Array.Resize(ref T,int)执行此操作,因为我在编译时不知道T.

有没有办法解决这个问题?

5 个答案:

答案 0 :(得分:5)

这应该有效:

static void Resize(ref Array array) {        
    Type elementType = array.GetType().GetElementType();
    Array newArray = Array.CreateInstance(elementType, newSize);
    Array.Copy(array, newArray, Math.Min(array.Length, newArray.Length);
    array = newArray;
}

答案 1 :(得分:2)

为什么不创建一个新的数组,无论你需要哪种类型,你想要的大小?然后从要调整大小的数组中填充它,将不存在的值设置为默认值。

答案 2 :(得分:1)

如果有人好奇,我最后切换我的代码使用List

答案 3 :(得分:0)

我同意您应该使用List(Of T)的注释,但是如果您想将数组复制到相同类型的新数组中,您可以执行以下操作。

// Your passed in array.
object[] objs = new object[5] {1,2,3,4,5};

// Create an array of the same type.
Array a = Array.CreateInstance(objs[0].GetType(), objs.Length+3);

// Copy in values.
objs.CopyTo(a,0);

答案 4 :(得分:0)

我想我会切换到使用列表,但这是一种耻辱;代码看起来会相当混乱,因为我的用户基本上处于第一学期的ugrads水平,每个小东西都会让他们的生活变得不那么好。但是我怀疑你们大家都没有办法做到这一点。好吧....