2015-06-10 113 views
2
public class Foo 
{ 
    private Bar FooBar {get;set;} 

    private class Bar 
    { 
     private string Str {get;set;} 
     public Bar() {Str = "some value";} 
    } 
} 

如果我有類似上面的內容,並且我有對Foo的引用,那麼我如何使用反射來獲取值Str出Foo的FooBar?我知道有沒有實際的理由永遠做這樣的事情(或非常非常少的方式),但我想,必須有一個辦法做到這一點,我想不出如何完成它。使用反射獲取私有財產的私有財產

編輯,因爲我問在體內的錯誤的問題,從正確的問題,不同的稱號

+1

你嘗試過什麼?一些谷歌和一些試驗和錯誤,你應該立即完成這一點。 [訪問私有字段]的 –

+0

可能重複(http://stackoverflow.com/questions/10862747/access-private-fields) – Emz

+1

這真的不是一個困難的事情,它不是全部從公立不同,你只需要指定不同的'BindingFlags'。 –

回答

7

您可以使用GetProperty methodNonPublicInstance綁定標誌一起。

假設你有Foo一個實例,f

PropertyInfo prop = 
    typeof(Foo).GetProperty("FooBar", BindingFlags.NonPublic | BindingFlags.Instance); 

MethodInfo getter = prop.GetGetMethod(nonPublic: true); 
object bar = getter.Invoke(f, null); 

更新

如果您要訪問的Str財產,只是做bar對象是獲取同樣的事情:

PropertyInfo strProperty = 
    bar.GetType().GetProperty("Str", BindingFlags.NonPublic | BindingFlags.Instance); 

MethodInfo strGetter = strProperty.GetGetMethod(nonPublic: true); 

string val = (string)strGetter.Invoke(bar, null); 
+0

我在這個問題的體說錯的問題不同問題的體輸入了一個錯誤的問題,並敲出了一個問題,在標題比一個不同所造成。我不是在嘗試Foo的FooBar,而是試圖讓Foo的FooBar的Str。 – claudekennilol

+0

@claudekennilol:請參閱更新 –

+0

感謝。我以爲我曾嘗試過,但肯定是在那裏有一個錯字。這真的很容易,因爲它應該是。 – claudekennilol