如何通过反射获取类及其父类的私有字段?
Posted
技术标签:
【中文标题】如何通过反射获取类及其父类的私有字段?【英文标题】:How to get the private fields of class and its parent class(es) by reflection? 【发布时间】:2011-08-20 03:33:42 【问题描述】:我在命名空间域中有类 B 及其父类 A。
A 类,具有私有字段 a; B 类,有私有字段 b;然后我在命名空间 Reflect 中有一个 Reflection Util。 如果我使用这条线
instanceOfB.GetType().GetFields(BindingFlags.NonPublic
| BindingFlags.Public | BindingFlags.Instance );
要查找所有字段(a 和 b),我只得到 b。但是,当我将 a
设为受保护或公开时,我也会找到它们。
我还需要做什么才能找到基类的私有字段?
【问题讨论】:
【参考方案1】:这是documented behaviour:
指定 BindingFlags.NonPublic 以在搜索中包含非公共字段(即私有、内部和受保护的字段)。仅返回基类上的受保护和内部字段;不返回基类的私有字段。
如果您需要获取私有字段,则需要询问基本类型。 (使用Type.BaseType
查找基本类型,然后调用GetFields
。)
【讨论】:
请允许我再问一点:当我通过类层次结构递归时,我如何确保我只获得每个字段(甚至是父级的公共字段)一次?跨度> @Ralph:您可以使用BindingFlags.DeclaredOnly
来避免从基类继承字段。【参考方案2】:
instanceOfB.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance );
【讨论】:
【参考方案3】: 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);
【讨论】:
先生,按照上面的代码行,我的结果很好。它显示了私有变量。 base 类的私有变量?不应该。 你根本没有给出任何解释——只是代码......它基本上显示了与问题相同的东西,除了你没有让B
派生自A
。跨度>
我没有看到任何解释。无论如何,“问题”是 B 必须是 A 的派生类。(在你的例子中它不是)以上是关于如何通过反射获取类及其父类的私有字段?的主要内容,如果未能解决你的问题,请参考以下文章