C# - 获取类字段属性值

时间:2015-04-13 15:17:39

标签: c# asp.net

假设我有一个由其他具有如下属性的类组成的类:

public class classA {
    public classAA classAA = new classAA();
    public classAB classAB = new classAB();

}

public class classAA {
    public string propertyA { get; set; }        
}

public class classAB {
    public string propertyB { get; set; }
}

我想迭代所有classA字段,然后迭代它们的属性并获取它们的值。 我创建了简单的控制台应用程序来测试它。

classA classA = new classA();
classA.classAA.propertyA = "A";
classA.classAB.propertyB = "B";

    foreach (FieldInfo memberAField in classA.GetType().GetFields()) {
        Console.WriteLine(memberAField.Name + " " + memberAField.MemberType + " " + memberAField.FieldType);
        foreach (PropertyInfo classAProperty in memberAField.FieldType.GetProperties()) {
            Console.WriteLine("name: " + classAProperty.Name);
            Console.WriteLine(" to value: " + classAProperty.GetValue(memberAField));
            }
        }

现在我不知道要传递给GetValue函数的内容。我已经尝试了我能想到的一切,但我总是得到错误"对象与目标类型不匹配。" 我认为问题是memberAField是FieldInfo对象,但我怎样才能获得实际的System对象?

编辑:谢谢你们的回答!此外,我不认为这应该被标记为重复,因为我认为这是不同的问题。标题是相似的,是的。

2 个答案:

答案 0 :(得分:3)

您必须将您想要的实例传递给get the value

首先,您必须获得memberAField.GetValue(classA),因此您拥有该字段的值,相当于classA.classAA。然后使用此结果classAProperty.GetValue(memberAField.GetValue(classA))调用get值,相当于classA.classAA.PeropertyA

        Console.WriteLine(" to value: " + classAProperty.GetValue(memberAField.GetValue(classA)));

完整代码:

classA classA = new classA();
classA.classAA.propertyA = "A";
classA.classAB.propertyB = "B";

foreach (FieldInfo memberAField in classA.GetType().GetFields()) {
    Console.WriteLine(memberAField.Name + " " + memberAField.MemberType + " " + memberAField.FieldType);
    object memberAValue = memberAField.GetValue(classA);
    foreach (PropertyInfo classAProperty in memberAField.FieldType.GetProperties()) {
        Console.WriteLine("name: " + classAProperty.Name);
        if (memberAValue == null)
            Console.WriteLine(" no value available");
        else
            Console.WriteLine(" to value: " + classAProperty.GetValue(memberAValue));
        }
    }

答案 1 :(得分:2)

GetValue需要一个您获取属性值的对象实例,因此您只需要在初始对象上调用FieldInfo.GetValue

foreach (FieldInfo memberAField in classA.GetType().GetFields()) {
    Console.WriteLine(memberAField.Name + " " + memberAField.MemberType + " " + memberAField.FieldType);

    object memberAValue = memberAField.GetValue(classA);  // instance to call GetValue on later.

    foreach (PropertyInfo classAProperty in memberAField.FieldType.GetProperties()) {
        Console.WriteLine("name: " + classAProperty.Name);
        Console.WriteLine(" to value: " + classAProperty.GetValue(memberAValue));
        }
    }