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


我在类名称空间Domain中有B类及其父类A.

  • A类,有私人领域a;
  • B类,有私人领域b;

然后我在名称空间Reflect中有一个Reflection Util。 如果我使用这一行

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

要找到所有字段(a和b),我只得到b。但是当我做的时候 a 保护或公开我也发现它们。

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


7925
2018-05-06 12:04


起源



答案:


这是 记录的行为

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

如果您需要获取私有字段,则需要询问基本类型。 (使用 Type.BaseType 找到基类型,然后调用 GetFields 在那。)


13
2018-05-06 12:06



请允许我再问一下:当我通过类层次结构递归时,我如何确保我只获得一次每个字段(甚至是父项的公共字段)? - Ralph
@Ralph:你可以用 BindingFlags.DeclaredOnly 至 避免 获取从基类继承的字段。 - Jon Skeet
Jon Skeet:非常感谢 - Ralph


答案:


这是 记录的行为

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

如果您需要获取私有字段,则需要询问基本类型。 (使用 Type.BaseType 找到基类型,然后调用 GetFields 在那。)


13
2018-05-06 12:06



请允许我再问一下:当我通过类层次结构递归时,我如何确保我只获得一次每个字段(甚至是父项的公共字段)? - Ralph
@Ralph:你可以用 BindingFlags.DeclaredOnly 至 避免 获取从基类继承的字段。 - Jon Skeet
Jon Skeet:非常感谢 - Ralph


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

1
2018-05-06 12:07





 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);

-4
2018-05-06 12:10



根据问题,他已经包含了这些价值观。 - Jon Skeet
先生,按照上面的代码行,我的工作正常。它显示了私有变量。 - Pankaj
私有变量 基础 类?它不应该。 - Jon Skeet
你根本没有给出任何解释 - 只是代码...它基本上显示了与问题相同的东西,除了你没有做过 B 从获得 A。 - Jon Skeet
我没有看到任何解释。无论如何,“问题”是B必须是A的派生类。(在你的例子中它不是) - Ralph