-1

先週も似たようなことを質問したのですが、かなりややこしいと思うので、簡単にしてみます。

たとえば、次のようなプロパティのみを含むクラスがあるとします。

public class MyPropertyClass
{
    public int IntegerProperty { get; set; }
}

MyPropertyClassここで、次のような配列を持つ別のクラスを作成したとします。

public class AnotherPropertyClass
{
    public MyPropertyClass[] ArrayProperty { get; set; }
}

ここが複雑な部分です。MyPropertyClass[]どういうわけか動的に作成する必要があります。私はこれまでにそれを試してきましたList<object>。次に、InvokeMemberこの配列で を呼び出します。このようなもの:

//The list that I am adding elements to elsewhere in the code
List<object> objList = new List<object>();

//Adding a couple elements
objList.Add(new MyPropertyClass());
objList.Add(new MyPropertyClass());

//Create the parameter object array, has to be length one and contain an
//object array casted to MyPropertyClass or it will throw an exception.
object[] ob = new object[1] { objList.ToArray() };

//Instantiate the actual object I want to assign the array to.
object obj = new AnotherPropertyClass();

//The call to InvokeMember
obj.GetType().InvokeMember(
    "ArrayProperty",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
    Type.DefaultBinder,
    obj,
    ob);

このコードは例外をスローします。問題は、objList.ToArray() が を作成し、object[]InvokeMember がそれを に割り当てようとするとMyPropertyClass[]、すべての要素が型であるにもかかわらず、型の不一致について不平を言うことMyPropertyClassです。基本的に私が必要としているのは、「ねえ、objList.ToArray() 内のすべての要素は、MyPropertyClassオブジェクト {MyPropertyClass[]} になりますが、実際の型は任意です。そうではないかもしれませんMyPropertyClass。コンパイル時にはわかりません。

私がここに持っているのは、これまでのところ私の試みにすぎません。別のアプローチを知っていれば、私はすべて耳にします。詳細については、私の古い質問を参照してください。

object[] のカスタム型配列へのランタイム キャスト

私が抱えている実際の問題に関係のない余分なものはほとんどないと思います。

4

2 に答える 2

3

次のように、指定されていない型の配列を作成できます。

Array array = Array.CreateInstance(someType, someSize);
于 2012-12-17T16:23:24.950 に答える
1

次のようにします。

List<MyPropertyClass> objList = new List<MyPropertyClass>();
objList.Add(new MyPropertyClass());
objList.Add(new MyPropertyClass());

AnotherPropertyClass obj = new AnotherPropertyClass();

obj.GetType().GetProperty("ArrayProperty").SetValue(obj, objList.ToArray());
于 2012-12-17T16:30:29.387 に答える