0

我有一个对象数组(object[])。此数组中的所有项都具有相同的类型(编译时未知)。我需要将此数组转换为类型化数组,也就是说,如果项目是整数,我想得到一个int[].

我已经研究了该Array.ConvertAll方法,但我需要在模板中指定一个特定类型,这意味着我必须获取元素类型,然后ConvertAll为每种可能的情况调用。

我还研究了dynamic没有更多运气的关键字(看起来dynamic[]与 相同object[])。

我怎样才能做到这一点?

4

2 回答 2

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手动使用反射进行调用,而不是使用动态类型。

另请注意,如果输入数组为空,所有这些都将失败...

于 2012-11-07T12:32:46.310 回答
2

与 Jon 的解决方案类似,您可以在没有动态的情况下使用 Array 类型:

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;
}
于 2012-11-07T12:38:41.503 回答