C# C:有没有一种方法可以使用反射来调整未知类型数组的大小?

C# C:有没有一种方法可以使用反射来调整未知类型数组的大小?,c#,arrays,reflection,resize,C#,Arrays,Reflection,Resize,我的用户向我传递某种类型的数组,比如int[]或string[]。我可以通过GetElementType轻松地查询元素的类型,并且我可以找出数组通过GetRank、GetLength等传递给我时的长度 数组以参数列表的形式传递,因此可视化代码如下: public void Resizer(params object[] objs) { foreach (object o in objs) Array.Resize(ref o, 3);

我的用户向我传递某种类型的数组,比如int[]或string[]。我可以通过GetElementType轻松地查询元素的类型,并且我可以找出数组通过GetRank、GetLength等传递给我时的长度

数组以参数列表的形式传递,因此可视化代码如下:

    public void Resizer(params object[] objs)
    {
        foreach (object o in objs)
            Array.Resize(ref o, 3);
    }
我想做的是与可用的Get方法相反的事情:我想调整传递给我的数组的大小,将长度设置为其他一些长度,如这个愚蠢的示例中的3

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

我不能对Array.Resizeref t,int执行此操作,因为我在编译时不知道t


有办法做到这一点吗?

为什么不创建一个新的数组,它可以是您需要的类型,也可以是您想要的大小?然后从要调整大小的数组中填充它,将不存在的值设置为一些默认值。

为什么不创建一个新的数组,该数组的类型可以是您想要的大小?然后从要调整大小的数组中填充它,将不存在的值设置为一些默认值。

这应该可以:

static void Resize(ref Array array, int newSize) {        
    Type elementType = array.GetType().GetElementType();
    Array newArray = Array.CreateInstance(elementType, newSize);
    Array.Copy(array, newArray, Math.Min(array.Length, newArray.Length));
    array = newArray;
}
这应该起作用:

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

我同意您应该使用ListOf 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);

我同意您应该使用ListOf 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);

我想我会转而使用列表,但这是一种耻辱;代码看起来会比较混乱,因为我的用户基本上处于第一学期ugrads的水平,每一件小事都会让他们的生活变得不那么美好。但我怀疑你们也没有办法做到这一点。哦,好吧……

我想我还是改用列表吧,但这太可惜了;代码看起来会比较混乱,因为我的用户基本上处于第一学期ugrads的水平,每一件小事都会让他们的生活变得不那么美好。但我怀疑你们也没有办法做到这一点。哦,好吧……

如果有人好奇,我会将代码切换为使用列表

如果有人好奇,我会将代码切换为使用列表

您是否考虑过使用一个在添加元素时自动调整大小的列表?为什么您的用户会向您传递一系列有问题的遗产?例如,为什么不使用泛型或一种动态数据结构(如List)来使用特定类型呢?该类型完全依赖于服务。一个可能会传回图像,另一个温度,另一个过去问过类似问题的人数。当您的用户使用一个本身使用泛型定义的库时,就像我的一样,这是一个常见的问题。当然是一种选择,但因为索引到列表中效率很低,这不是我的首选。但我可以照你的建议去做,那将是我的责任fallback@Ken,索引到列表中效率低下?列表在内部使用数组,因此为列表编制索引的效率与为数组编制索引的效率一样。您是否考虑过使用在向列表中添加元素时自动调整大小的列表?为什么您的用户向您传递一个有问题的数组?例如,为什么不使用泛型或一种动态数据结构(如List)来使用特定类型呢?该类型完全依赖于服务。一个可能会传回图像,另一个温度,另一个过去问过类似问题的人数。当您的用户使用一个本身使用泛型定义的库时,就像我的一样,这是一个常见的问题。当然是一种选择,但因为索引到列表中效率很低,这不是我的首选。但我可以照你的建议去做,那将是我的责任fallback@Ken,索引到列表中效率低下?一个列表在内部使用一个数组,所以索引一个列表和索引一个非常有效的数组一样有效。我这样做是因为语法上的原因,在这个特殊的例子中,我想让它们传递位置持有者。PS:想想旧的C scanf;我的情况与此相似。引用参数所需的Scanf,并将内容扫描到其中。我试图为这个特定的接口模仿这种编码风格;我想用ref向量来填充它们。但是1个参数不允许你通过ref发送东西,对参数有限制,2个不知道向量的长度,直到我知道有多少服务器响应!

@Ken如果你能够获取对象而不是标准类型,它们将通过引用传递。是的,没错。所以:他们创建了一个向量,比如int[0]或Foo[0]。传过来。我从服务器上得到了11个Foo对象。现在我想让他们得到一个数组Foo[15]。所以我想做Array.Resizeref hisObject,len,但现在我被卡住了:无法获取ref,Foo需要是编译时类型,而不是运行时类型。我这样做是因为语法上的原因,在这个特殊情况下,我希望它们传递placeholder.PS:想想旧的C scanf;我的情况与此相似。引用参数所需的Scanf,并将内容扫描到其中。我试图为这个特定的接口模仿这种编码风格;我想用ref向量来填充它们。但是1个参数不允许你通过ref发送东西,对参数有限制,2个不知道向量的长度,直到我知道有多少服务器响应@Ken如果你能够获取对象而不是标准类型,它们将通过引用传递。是的,没错。所以:他们创建了一个向量,比如int[0]或Foo[0]。传过来。我从服务器上得到了11个Foo对象。现在我想让他们得到一个数组Foo[15]。所以我想做Array.Resizeref hisObject,len,但现在我被卡住了:无法获取ref,Foo需要是编译时类型,而不是运行时类型。无法将其传递回。所以是的,我可以这样做,但是他们通过我的任何东西都不会改变。把它传回去?如果你有一张a名单,伙计们,相信我的话。我可以使用列表,但在这种情况下,最终用户会觉得它很难看。让我们先讨论一下,相信我的话,我真正想做的是研究未知类型的向量,好吗?我听到了,但要解释为什么列表在我的情况下并不理想,需要大量的打字。那么让我们把它看成是给定的?不能把它传回去。所以是的,我可以这样做,但是他们通过我的任何东西都不会改变。把它传回去?如果你有一张a名单,伙计们,相信我的话。我可以使用列表,但在这种情况下,最终用户会觉得它很难看。让我们先讨论一下,相信我的话,我真正想做的是研究未知类型的向量,好吗?我听到了,但要解释为什么列表在我的情况下并不理想,需要大量的打字。那么,让我们把它看作是给定的?不明白为什么这会起作用。Array.Copy是否处理大小调整?如果是这样,那就解决我的问题了,谢谢!我要试试GetElementType比我的索引0优雅得多+1George,不清楚这与显示的代码有何关联。显然,我们使用GetElementType来获取类型。但是不能在Array.Resize中使用GetElementType,因为必须使用静态编译时类型而不是运行时类型来指定t。哦,我明白了。这根本不起作用。它甚至不尝试调整旧数组的大小。完全忽略了我想做的事。我希望旧数组有一个新的大小。@肯:然后简单地分配oldArray=newArrayDon,我不明白为什么会这样。Array.Copy是否处理大小调整?如果是这样,那就解决我的问题了,谢谢!我要试试GetElementType比我的索引0优雅得多+1George,不清楚这与显示的代码有何关联。显然,我们使用GetElementType来获取类型。但是不能在Array.Resize中使用GetElementType,因为必须使用静态编译时类型而不是运行时类型来指定t。哦,我明白了。这根本不起作用。它甚至不尝试调整旧数组的大小。完全忽略了我想做的事。我希望旧数组有一个新的大小。@肯:然后简单地分配oldArray=newArray