使用Reflection在多个子类级别中获取字段值

时间:2013-01-11 16:36:26

标签: c# reflection mono field

所以我有这个对象有多个级别的子类,就像这样(不是实际的对象,而是一个抽象来传达它的结构):

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'等。
我做错了吗?

3 个答案:

答案 0 :(得分:1)

  

我做错了吗?

是 - 在此表达式中:

field.GetValue( t.FieldType )

传递给GetValue的参数应该是定义字段的类型的实例。它应该是包含您想要获取的特定字段值的对象。

t.FieldTypeSystem.Type

类型的实例

答案 1 :(得分:0)

GetValue要求的班级SubTypeASubTypeB的实例中,必须接收哪些字段,但是您传递了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个实例,然后您应该获得subTypeAsubTypeBvalue.typeA的值。 这些值将作为嵌套foreach中GetValue的参数传递。

答案 2 :(得分:0)

对我来说,以下代码有效:

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

GetType 是实例方法而非静态方法。要获取Type对象,您需要使用 typeof