0

したがって、このオブジェクトには複数のレベルのサブクラスがあります(実際のオブジェクトではなく、構造を伝えるための抽象化):

public class MasterType
{
    public TypeA typeA = new TypeA();
    public TypeB typeB = new TypeB();

    public class TypeA
    {
        public SubTypeA subTypeA = new SubTypeA();
        public SubTypeB subTypeB = new SubTypeB();

        public class SubTypeA
        {
            public int Field1 = 10;
        }

        public class SubTypeB
        {
            public int Field2 = 20;
        }
    }

    public class typeB
    {
        public int Field3 = 30;
    }
}

TypeA のフィールドを抽出しようとしましたが、そのサブクラス (SubTypeA と SubTypeB) は次のようになります。

foreach (var t in MasterType.TypeA.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy))
{
    foreach (var field in t.FieldType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
    {
        Console.WriteLine(field.Name + " | " + field.GetValue(t.FieldType));
    }
}

しかし、私はこの例外を受け取ります:

ArgumentException: Field 'Field1' defined on type 'SubTypeA' is not a field on the target object which is of type 'MonoType'.

t の FieldType を出力すると、期待される結果 'SubTypeA' などが得られます
。何か間違っていますか?

4

3 に答える 3

1

私は何か間違ったことをしていますか?

はい - この式では:

field.GetValue( t.FieldType )

に渡されるパラメーターGetValueは、フィールドを定義する型のインスタンスである必要があります。取得する特定のフィールド値を含むオブジェクトである必要があります。

t.FieldType型のインスタンスですSystem.Type

于 2013-01-11T16:51:53.913 に答える
0

GetValueクラスSubTypeAとのインスタンスが必要SubTypeBで、どのフィールドを受け取る必要がありますが、インスタンスを渡しますType

この方法を試してください:

        MasterType value = new MasterType();
        foreach (var t in typeof(MasterType.TypeA).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy))
        {
            var fieldValue = t.GetValue(value.typeA);
            foreach (var field in t.FieldType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
            {
                Console.WriteLine(field.Name + " | " + field.GetValue(fieldValue));
            }
        }

MasterType最初にインスタンスを作成する必要があります。その後、subTypeAとの値を取得する必要がsubTypeBありますvalue.typeA。これらの値はGetValue、ネストされた foreach の引数として渡されます。

于 2013-01-11T16:51:45.507 に答える
0

私にとっては、次のコードが機能します。

foreach (var fieldInfo in typeof(MasterType.TypeA).GetFields())
{
 Console.WriteLine(fieldInfo);
}

GetTypeはインスタンス メソッドであり、静的ではありません。Type オブジェクトを取得するには、 typeofを使用する必要があります。

于 2013-01-11T16:55:37.067 に答える