关于asp.net:C# – 获取类字段属性值

C# - Get class field property value

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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字段,然后遍历它们的属性并获取它们的值。我创建了简单的控制台应用程序来测试这一点。

1
2
3
4
5
6
7
8
9
10
11
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对象,但是我如何才能得到实际的系统对象呢?

编辑:谢谢你们的回答!另外,我不认为这应该标记为副本,因为我认为这是不同的问题。标题很相似,是的。


必须传递要从中获取值的实例。

首先,你必须得到memberAField.GetValue(classA),这样你就得到了字段的值,相当于classA.classAA。然后使用该结果调用get值classAProperty.GetValue(memberAField.GetValue(classA)),相当于classA.classAA.PeropertyA

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

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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));
        }
    }


GetValue需要一个对象实例来获取属性值,所以只需在初始对象上调用FieldInfo.GetValue

1
2
3
4
5
6
7
8
9
10
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));
        }
    }