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

发布于 2024-11-05 11:16:22 字数 386 浏览 0 评论 0原文

我有类 B 及其父类 A,两者都在命名空间 Domain 中。

  • A类,有私有字段a;
  • B类,有私有字段b;

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

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

来查找所有字段(a 和 b),我只得到 b。但是当我将 a 设为受保护或公开时,我也会找到它们。

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

I have the class B and its parent class A, both in namespace Domain.

  • Class A, has the private field a;
  • Class B, has the private field b;

Then I have a Reflection Util in namespace Reflect.
If I use this line

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

to to find all fields (a & b), I get only b. But when I make a protected or public I find them too.

What do I need to do to find the private fields of the base class too?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

楠木可依 2024-11-12 11:16:22

这是记录的行为

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

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

This is the documented behaviour:

Specify BindingFlags.NonPublic to include non-public fields (that is, private, internal, and protected fields) in the search. Only protected and internal fields on base classes are returned; private fields on base classes are not returned.

If you need to get private fields, you'll need to ask the base type. (Use Type.BaseType to find the base type, and call GetFields on that.)

天煞孤星 2024-11-12 11:16:22
instanceOfB.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance );
instanceOfB.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance );
淡忘如思 2024-11-12 11:16:22
 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);
 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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文