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 に答える