|
分類:[C#]
> Array.CreateInstance(Type, Int32) の第二引数で指定するのは次元数ではなく要素数です。この引数を持ったオーバーロードを使用する場合、次元数は 1 で固定です(とリファレンスにも書いてありますよね?)。 > 失礼しました。 次元数ではなく要素数でした。(用語の使用が間違ってました。)
> 各要素を設定したいなら、そりゃそれぞれのインスタンスを作成する必要があるでしょう。各インスタンスの作成は一番初めの投稿でなさってますよね? > 引き数を2つ使用して最初に投稿したようにすればインスタンスの設定もできるのですが、引き数を一つ(typeof(A[]))にした時のインスタンスの設定方法がわかりません。 単純に obj[0] = Activator.CreateInstance(objType1); と記述するとエラーが出てしまうわけです。 (エラー:このプロジェクトで引き数なしコンストラクタは定義されていません。) 因みに要素数の指定は Array を使用しなくても obj = (Object[])Activator.CreateInstance(objType1, 1); で可能なのですが。
> このサンプルでは Int32 の配列を作成していますが、このとき elementType パラメータ(第一引数)にはどんなものを指定しているでしょうか? > サンプルはInt32の配列なので数字を設定してますよね。 これを私のプログラムで活用する時にはどうするのでしょう。 objType1が保有しているクラスのインスタンスの設定方法がわかりません。
private void button1_Click(object sender, EventArgs e) { A[] a; a = (A[])Test(typeof(A[])); } private Object Test(Type objType) { Object[] obj; obj = (Object[])Activator.CreateInstance(objType, 1); // ここで各要素にインスタンスを作成 // obj[0] = Activator.CreateInstance(?????); return obj; }
または
private Object Test(Type objType) { Object[] obj; obj = (Object[])Activator.CreateInstance(objType, 1); Array myArray = obj; for (int i = myArray.GetLowerBound(0); i <= myArray.GetUpperBound(0); i++) { // ここで各要素にインスタンスを作成 //myArray.SetValue(?????, i); } return obj; }
|