使用反射在子类的多个级别中获取字段值

本文关键字:获取 字段 反射 子类 | 更新日期: 2023-09-27 17:51:18

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

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

使用反射在子类的多个级别中获取字段值

我做错了什么吗?

Yes -在这个表达式中:

field.GetValue( t.FieldType )

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

t.FieldType是类型System.Type的实例

对于我来说,下面的代码可以工作:

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

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

在你的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实例,之后您应该获得value.typeA中的subTypeAsubTypeB的值。这些值将作为嵌套foreach中GetValue的参数传递。