我试图反映派生类型中的字段,但它返回的字段 基础类型。
public class basetype
{
string basevar;
}
public class derivedtype : basetype
{
string derivedvar;
}
在某些功能中:
derivedtype derived = new derivedtype();
FieldInfo[] fields = derived.GetType().GetFields();
这将返回basevar,但不返回derivedvar。我已经尝试了所有不同的绑定,但它似乎没有什么区别。
另外,我在App_Code中的ASP.NET中执行此操作,其中basevar在App_Code中定义,derivedvar是在App_Controls中定义的用户控件,其中类型不在范围内。
答案 0 :(得分:10)
原样,这将不返回任何内容,因为默认绑定仅适用于公共字段。
同样,derivedtype不是从basetype派生的
使用:
FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
返回derivedvar。我刚刚检查过LINQPad。
如果我将derivedtype更改为从basetype派生,那么我可以使用以下两个字段获取
FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Concat(derived.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)).ToArray();
答案 1 :(得分:3)
反思有点奇怪。
如果成员是公开的,那么整个层次结构中的所有成员都是可见的。
如果成员是非公开的,则必须指定BindingFlags.NonPublic,并且只获得使用类型的成员。继承的成员不可见。如果你想看到一个类型的所有非公开成员,你必须走上继承链。