C# 获取派生类型的字段

C# 获取派生类型的字段,c#,reflection,C#,Reflection,我试图在派生类型中反映字段,但它返回 基本类型 public class basetype { string basevar; } public class derivedtype : basetype { string derivedvar; } 在某些功能中: derivedtype derived = new derivedtype(); FieldInfo[] fields = derived.GetType().GetFields(); 这将返回basevar,

我试图在派生类型中反映字段,但它返回 基本类型

public class basetype
{
    string basevar;
}

public class derivedtype : basetype
{
    string derivedvar;
}
在某些功能中:

derivedtype derived = new derivedtype();

FieldInfo[] fields = derived.GetType().GetFields();
这将返回basevar,但不返回derivedvar。我尝试了所有不同的绑定,但似乎没有什么不同


另外,我在ASP.NET的App_代码中这样做,其中basevar在App_代码中定义,DeriveVar是在类型不在范围内的App_控件中定义的用户控件。

反射有点奇怪

如果成员是公共的,则整个层次结构中的所有成员都可见


如果成员是非公共的,则必须指定BindingFlags.NonPublic,并且只能获取所使用类型的成员。继承的成员不可见。如果要查看某个类型的所有非公共成员,则必须沿着继承链进行操作。

按原样,这将不返回任何内容,因为默认绑定仅用于公共字段

同样,derivedtype不是从basetype派生的

与:

它返回derivedvar。我刚在林帕德登记

如果我将derivedtype更改为从basetype派生,那么我可以使用以下两个字段获得这两个字段:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Concat(derived.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)).ToArray();

一旦我将字段公开以将其公开给
GetFields()
,您的代码对我很有用(我看到
derivedvar
)。你确定你的阶级结构吗?您是否在独立项目中尝试过上述代码?在上述代码中,
derivedtype
甚至不是从
basetype
派生的,因此您应该只看到
derivedvar
(带有BindingFlags.NonPublic),而不是
basevar
@dtb:我错过了这一点。只是用适当的推导重新运行;相同的结果。对,我在代码示例中遗漏了派生。我改了,谢谢你的帮助。这并不奇怪,但应该是这样的。想象一下,您可以为派生类中的字段指定任何名称,基类中的私有字段除外。那么这个私人领域就不再那么私人了。如果我错了,请纠正我,但我认为你误解了这个问题。我的问题是试图获取派生成员时,它已经从基类返回继承的成员,但没有返回派生类中的任何成员。我尝试了BindingFlags.NonPublic,但也不起作用。@Epic720:正如我上面提到的,我怀疑您的类层次结构与您描述的不一样(事实上不可能是这样的-您在示例中显示的两个类甚至没有相互关联!)。你能把你真正的等级划分降低到你可以发布的东西吗?@dtb:你说得对,这是应该的。这不是直觉。如果这是你第一次尝试反思,而你没有仔细思考,你可能会觉得有点奇怪。就是这样,我也试图让私人成员参与进来,但在我让成员成为私人成员之前,我无法让它发挥作用。伙计们,我的疏忽太愚蠢了,对不起。在我的情况下,上面的行需要稍微调整一下:
FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Concat(derived.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)).ToArray();