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

我的用户传给我一些类型的数组,比如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.

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

这应该工作:

 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; } 

为什么不创建一个新的数组,你需要的是你想要的大小? 然后从要resize的数组中填充它,将不存在的值设置为某些默认值。

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

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

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