2011-02-23 24 views
0

可能性の重複:
C#: Is there a way to resize an array of unknown type using reflection?C#は未知のタイプの配列のサイズを変更

こんにちは、

が未知の型の配列のサイズを変更する方法はありますか?以下のサンプルコードをご覧ください。

object ReadArray() 
{ 
    Type classType = Type.GetType(arrayItemName, true); 
    object arr = Array.CreateInstance(classType, 0); // unknown length 

    // read length from a stream 
    ResizeArray(ref arr, length) 
    // populate array items from stream 

    // read length2 from stream2 
    ResizeArray(ref arr, length+length2) 
    // populate array items from stream2 

    return arr; 
} 

ResizeArray(ref object array, int n) 
{ 
    Array arr = array as Array; 
    Array.Resize(ref arr, n); // compile error! type can't be inferred 
    array = arr; 
} 
+0

あなたがそれにアイテムを追加するときに自動的にリサイズされます '一覧を'使用して考えがあります? –

+0

私はそのポストを見ました、それはリストを使用するか、毎回新しい配列インスタンスを作成することを示唆しています。私はもっ​​と良い解決策があるのだろうかと思っています。私はAPIを書いており、呼び出し側は配列を期待しています。 – dlsou

+0

はい、提案されたソリューションは毎回新しい配列インスタンスを作成します。しかし、 'Array.Resize'もそうです。唯一の違いは、提案されたソリューションが明示的にそれを行うのに対して、Array.Resizeは裏でそれを行う点です。 –

答えて

1

これは別のスレッドで解決されました:C#: Is there a way to resize an array of unknown type using reflection?

+0

私はそのポストを見ました、それはリストを使用するか、毎回新しい配列インスタンスを作成することを示唆しています。私はもっ​​と良い解決策があるのだろうかと思っています。私はAPIを書いており、呼び出し側は配列を期待しています。 – dlsou

+0

残念ながら、C#で配列のサイズを変更することはできません。あなたはVBとVb.Netで(それが役立つ場合)できます。 – CarneyCode

+0

@Dona: 'Array.Resize'を使用すると、毎回新しい配列インスタンスが作成されます。 – Timwi

3

は、一般的なリストを使用してください。それでは、サイズ変更に問題はありません。

-2
Resize(ref object array, int size){ 
    object[] newarray = new object[size]; 
    for(int i=0;i<array.length&&i<size;i++){ 
     newarray[i] = array[i]; 
    } 
    array = newarray; 
} 
+0

これは間違っています:1.これは何もサイズを変更しません(あなたは 'size'を全く使用していません...)。2.これは不必要に配列_twice_をコピーします。 – Mormegil

+0

申し訳ありません私は周りに遊んでいたし、私が完了する前に答えを提出した。それは修正されました。 – Paul

+0

これはコンパイルされません( 'array [i]'は 'array'が単なる' object'であるためインデックスできません。( 'Array'以外の型は分かりません。 – Mormegil

1

上記のリンクされた方法に加えて、反射を使用することもできます。このような動作するはずです(私はより速く、それが良いことだと思う、または何もしていないにもかかわらず):

static void ResizeArray(ref object array, int n) 
{ 
    var type = array.GetType(); 
    var elemType = type.GetElementType(); 
    var resizeMethod = typeof(Array).GetMethod("Resize", BindingFlags.Static | BindingFlags.Public); 
    var properResizeMethod = resizeMethod.MakeGenericMethod(elemType); 
    var parameters = new object[] { array, n }; 
    properResizeMethod.Invoke(null, parameters); 
    array = parameters[0]; 
} 
関連する問題