GetFields派生类型

时间:2010-10-08 02:17:05

标签: c# reflection

我试图反映派生类型中的字段,但它返回的字段 基础类型。

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中定义的用户控件,其中类型不在范围内。

2 个答案:

答案 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,并且只获得使用类型的成员。继承的成员不可见。如果你想看到一个类型的所有非公开成员,你必须走上继承链。