所以我有这个对象与多个层次的子类,像这样(不是实际的对象,而是一个抽象来传达它的结构):
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
中需要SubTypeA
和SubTypeB
类的实例,这些字段必须被接收,但是你传递了一个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
中的subTypeA
和subTypeB
的值。这些值将作为嵌套foreach中GetValue
的参数传递。