2011-05-06 45 views
11

我有類B和它的父類A,都在名稱空間域中。如何通過反射獲得類的私有字段及其父類?

  • A類,有私人領域a;
  • B類,有私人領域b;

然後,我在名稱空間反射中使用了Reflection Util。 如果我用這條線

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

來找到所有字段(一& b)中,我得到的僅有B。但是,當我讓a受保護或公開我也找到他們。

我還需要做些什麼才能找到基類的私有字段?

回答

13

這是documented behaviour

指定BindingFlags.NonPublic包括非公共領域的搜索(即私有的,內部和保護的領域)。只返回基類中的受保護和內部字段;基類上的私有字段不會被返回。

如果您需要獲取私有字段,則需要詢問基本類型。 (使用Type.BaseType找到基本類型,並呼籲該GetFields

+0

請允許我問多一點:當我去遞歸通過量的類層次結構,如何讓我可以確信,我只有一次獲得每個領域(甚至是父母的公共領域)? – Ralph 2011-05-06 12:28:33

+1

@Ralph:你可以使用'BindingFlags.DeclaredOnly'來*避免*獲取從基類繼承的字段。 – 2011-05-06 12:30:00

+0

喬恩Skeet:非常感謝 – Ralph 2011-05-06 13:54:10

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

他已經包括那些價值觀,根據問題。 – 2011-05-06 12:13:21

+0

先生它在我的最後工作很好,按照上面的代碼行。它顯示私有變量。 – Pankaj 2011-05-06 12:18:41

+0

* base *類的私有變量?它不應該。 – 2011-05-06 12:20:33

相關問題