如何通过反射获取类及其父类的私有字段?

12

我有类B和其父类A,在命名空间Domain中。

  • 类A有一个私有字段a;
  • 类B有一个私有字段b;

然后我有一个位于Reflect名称空间中的反射工具。如果我使用下面这行代码:

instanceOfB.GetType().GetFields(BindingFlags.NonPublic 
         | BindingFlags.Public | BindingFlags.Instance );

当我尝试查找所有字段(a和b)时,只能获取到b。但是当我将a设置为protected或public时,也可以找到它们。

我需要做什么才能找到基类的私有字段?

3个回答

15

这是文档记录下的行为

指定BindingFlags.NonPublic以包含非公共字段(即私有、内部和受保护的字段)进行搜索。仅返回基类上受保护和内部的字段,不返回基类上的私有字段。

如果您需要获取私有字段,则需要向基础类型询问。(使用Type.BaseType查找基础类型,并在其上调用GetFields。)


请允许我再问一下:当我通过类层次结构进行递归时,如何确保我只获取每个字段一次(即父级的公共字段)? - Ralph
1
@Ralph:你可以使用 BindingFlags.DeclaredOnly避免获取从基类继承的字段。 - Jon Skeet

1
instanceOfB.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance );

-4
 public class A
 {
     private int aa;
 }

 public class B
 {
     private int bb;
 }

System.Reflection.FieldInfo[] fields = (new B()).GetType().GetFields(BindingFlags.NonPublic| BindingFlags.Public | BindingFlags.Instance);

先生,通过遵循上面的代码行,在我的设备上运行正常。它显示了私有变量。 - Pankaj
基类的私有变量?不应该。 - Jon Skeet
你根本没有给出任何解释 - 只有代码...这基本上展示了与问题相同的东西,除了你没有让 B 派生自 A - Jon Skeet
我没有看到任何解释。无论如何,“问题”是B必须是A的派生类。(而在你的例子中它不是) - Ralph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接