我有一个对象数组(object[]
)。该数组中的所有项目都具有相同的类型(编译时未知)。我需要在一个类型数组中转换这个数组,也就是说,如果这些项是整数,我想得到一个int[]
。自动拆箱
我已经看过Array.ConvertAll
方法,但我需要在模板中指定一个特定的类型,这意味着我必须获取元素类型,然后调用ConvertAll
为每个可能的情况。
我也看过关键字dynamic
没有更多的运气(看起来像dynamic[]
是object[]
相同)。
我该如何做到这一点?
我有一个对象数组(object[]
)。该数组中的所有项目都具有相同的类型(编译时未知)。我需要在一个类型数组中转换这个数组,也就是说,如果这些项是整数,我想得到一个int[]
。自动拆箱
我已经看过Array.ConvertAll
方法,但我需要在模板中指定一个特定的类型,这意味着我必须获取元素类型,然后调用ConvertAll
为每个可能的情况。
我也看过关键字dynamic
没有更多的运气(看起来像dynamic[]
是object[]
相同)。
我该如何做到这一点?
乔恩的解决方案,你可以在不动做,使用数组类型的相似:
public Array Convert(Array a) {
if (a.GetLength(0) == 0){
return new int[0];
}
var type = a.GetValue(0).GetType();
var result = Array.CreateInstance(type, a.GetLength(0));
for (int i = 0; i < a.GetLength(0); i++) {
result.SetValue(a.GetValue(i), i);
}
return result;
}
不错 - 这是比我的更好的解决方案,虽然我可能使用'object []'作为输入,所以你可以使用'0'和'a.Length'来代替所有的下限/上限。 –
@JonSkeet谢谢 - 我没有意识到,实际上今天你不能创建一个0以外的下界的数组 - 他们在VB 2003中明显改变了它。我会更新片段。 – Sebastian
这听起来像你想要的东西,如:
dynamic array = Array.CreateInstance(input[0].GetType(), input.Length);
for (int i = 0; i < input.Length; i++)
{
array[i] = (dynamic) input[i];
}
这里dynamic
只是处理转换部分为您服务。
或者:
public static Array ConvertArray(object[] input)
{
dynamic sample = input[0]; // Just used for type inference
return ConvertArrayImpl(sample, input);
}
private static T[] ConvertArrayImpl<T>(T sample, object[] input)
{
return input.Cast<T>().ToArray();
}
你能做到让ConvertArrayImpl
电话与反思手动的过程,而不是使用动态类型。
还要注意的是,如果输入数组为空,所有的这些都将失败......
你的第一个版本不起作用,它抛出'RuntimeBinderException'消息“无法隐式转换类型'对象'为'int'。”。将循环体更改为'array [i] =(dynamic)input [i];'修复了这个问题。 – svick
@svick:良好的发现 - 修好了,谢谢。 –
为什么你想这样做?你打算如何使用结果数组?它是否真的必须是运行时类型('Type'对象),还是泛型('T'类型参数)也可以吗? – svick
有趣的是 - 在运行时将'object []'转换为'int []'后,你将在运行时使用你的集合做什么?在编译时,你将无法使用你的项目作为int# –
我正在使用像'theMethod(object array)'方法的库,其中数组必须是给定类型的数组(返回错误在'object []'的情况下)。 – gregseth