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实例,然后你应该得到subTypeAsubTypeB的值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 回答