假设我有一个由其他具有如下属性的类组成的类:
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对象?
编辑:谢谢你们的回答!此外,我不认为这应该被标记为重复,因为我认为这是不同的问题。标题是相似的,是的。答案 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));
}
}