我有一个对象数组(object[]
)。此数组中的所有项具有相同的类型(在编译时未知)。我需要在一个类型化的数组中转换这个数组,也就是说,如果这些项是整数,我想得到一个int[]
。
我查看了Array.ConvertAll
方法,但我需要在模板中指定一个特定类型,这意味着我必须获取元素类型,然后针对每种情况调用ConvertAll
。< / p>
我也查看了关键字dynamic
而没有更多运气(看起来dynamic[]
与object[]
相同)。
我怎样才能做到这一点?
答案 0 :(得分:4)
听起来你想要这样的东西:
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
调用,而不是使用动态输入。
另请注意,如果输入数组为空,则所有这些都将失败...
答案 1 :(得分:2)
与Jon的解决方案类似,您可以在没有动态的情况下使用数组类型:
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;
}