【问题标题】:Getting field values in multiple levels of subclasses with Reflection使用反射获取多级子类中的字段值
【发布时间】:2013-01-11 16:36:26
【问题描述】:

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

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

【问题讨论】:

  • 我闻到“XY 问题”——你为什么要这样做?

标签: c# reflection mono field


【解决方案1】:

我做错了吗?

是的 - 在这个表达式中:

field.GetValue( t.FieldType )

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

t.FieldTypeSystem.Type 类型的实例

【讨论】:

  • 我明白了。确实,指定类型直接起作用,谢谢。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    在您的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 的值。 这些值将作为 GetValue 在嵌套 foreach 中的参数传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      相关资源
      最近更新 更多