2015-06-10 3 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 out Foo's FooBar? Я знаю, что нет реальной причины когда-либо делать что-то вроде этого (или очень немногие способы), но я полагаю, что должен быть способ сделать это, и я не могу понять, как это сделать.Получить частную собственность частной собственности, используя отражение

отредактирован, потому что я задал неправильный вопрос в теле, которое отличается от правильного вопроса в названии

+1

Что вы пробовали? Немного Google и некоторые пробные версии и ошибки, и вы должны сделать это в кратчайшие сроки. –

+0

Возможный дубликат [Доступ к закрытым полям] (http://stackoverflow.com/questions/10862747/access-private-fields) – Emz

+1

Это действительно не сложно, его не все, что отличается от публичных, вы просто нужно указать разные 'BindingFlags'. –

ответ

7

Вы можете использовать GetProperty method наряду с обязательными флагами NonPublic и Instance.

Предполагая, что вы экземпляр Foo, f:

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

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

Update:

Если вы хотите получить доступ к 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

Я оговорился в тексте вопроса и набрал вопрос, отличный от заданного в названии. Я не пытаюсь FooBar Foo, я пытаюсь получить Foo's FooBar's Str. – claudekennilol

+0

@claudekennilol: См. Обновление –

+0

Спасибо. Я думал, что попробовал, но, должно быть, у него была опечатка. Это было так просто, как должно было быть. – claudekennilol

Смежные вопросы