所以我有这个对象有多个级别的子类,就像这样(不是实际的对象,而是一个抽象来传达它的结构):
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'等。
我做错了吗?
答案 0 :(得分:1)
我做错了吗?
是 - 在此表达式中:
field.GetValue( t.FieldType )
传递给GetValue
的参数应该是定义字段的类型的实例。它应该是包含您想要获取的特定字段值的对象。
t.FieldType
是System.Type
答案 1 :(得分:0)
在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
个实例,然后您应该获得subTypeA
中subTypeB
和value.typeA
的值。
这些值将作为嵌套foreach中GetValue
的参数传递。
答案 2 :(得分:0)
对我来说,以下代码有效:
foreach (var fieldInfo in typeof(MasterType.TypeA).GetFields())
{
Console.WriteLine(fieldInfo);
}
GetType 是实例方法而非静态方法。要获取Type对象,您需要使用 typeof 。