2010-10-08 94 views
4

我想反映派生類型中的字段,但它返回基類型爲 的字段。派生類型的GetFields

public class basetype 
{ 
    string basevar; 
} 

public class derivedtype : basetype 
{ 
    string derivedvar; 
} 

在一些功能:

derivedtype derived = new derivedtype(); 

FieldInfo[] fields = derived.GetType().GetFields(); 

這將返回basevar,但不derivedvar。我試過所有不同的綁定,它似乎沒有什麼區別。

此外,我在App_Code中的ASP.NET中執行此操作,其中basevar在App_Code中定義,而derivedvar是在App_Controls中定義的用戶控件,其中類型不在範圍內。

+1

您的代碼工作對我來說(我看'derivedvar'),一旦我做了場公衆揭露他們到'GetFields()'。你確定你的類層次嗎?您是否在獨立項目中嘗試過上述代碼? – 2010-10-08 02:23:27

+1

在上面的代碼中,'derivedtype'甚至不是從'basetype'派生的,所以你只能看到'derivedvar'(帶有BindingFlags.NonPublic),而不能'basevar'。 – dtb 2010-10-08 02:30:40

+0

@dtb:我錯過了。只要適當地推導就可以了;相同的結果。 – 2010-10-08 02:32:53

回答

7

就這樣,這將不會返回任何內容,因爲默認綁定僅適用於公共字段。

也如,derivedtype不是從基本類型

衍生有了:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 

它返回derivedvar。我剛剛檢查了LINQPad。

如果我改變derivedtype從基類型導出,然後我可以得到這兩個領域有:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Concat(derived.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)).ToArray(); 
+0

就是這樣,我試圖讓私人成員也是如此,但是直到我將成員私人化之前,我無法實現它。愚蠢的監督我的部分人,對不起。 – KenEucker 2010-10-08 04:20:48

2

反射有點奇怪。

如果成員是公開的,則所有成員都是可見的。

如果成員是非公開的,則必須指定BindingFlags.NonPublic,並且只會獲得那些使用類型的成員。繼承的成員不可見。如果你想看到一個類型的所有非公開成員,你必須走上繼承鏈。

+0

這並不「奇怪」,但它究竟應該如何。想象一下,除了基類中私有字段的名稱之外,您可以在派生類中爲字段賦予任何名稱。那麼私人領域就不再是私人領域了。 – dtb 2010-10-08 02:45:31

+0

糾正我,如果我錯了,但我認爲你在這裏誤解了這個問題。我的問題是嘗試獲取派生成員,它已經從基類返回繼承成員,但不返回派生類中的任何成員。我嘗試了BindingFlags.NonPublic,但它也沒有工作。 – KenEucker 2010-10-08 03:16:00

+0

@ Epic720:正如我上面提到的那樣,我懷疑你的類層次結構並不像你所描述的那樣(事實上它不可能是這樣 - 在你的例子中顯示的兩個類別甚至不相互關聯!)。你能否將你真實的層次轉化爲你可以發佈的東西? – 2010-10-08 03:21:19