public class Foo { private Bar FooBar {get;set;} private class Bar { private string Str {get;set;} public Bar() {Str = "some value";} } }Si tengo algo como lo anterior y tengo una referencia a Foo, ¿cómo puedo usar la reflexión para obtener el valor Str out Foo's FooBar? Sé que no hay una razón real para hacer algo como esto (o muy, muy pocas formas), pero me imagino que tiene que haber una manera de hacerlo y no puedo encontrar la manera de lograrlo.
editado porque hice la pregunta incorrecta en el cuerpo que difiere de la pregunta correcta en el título
Puede usar el método GetProperty junto con las marcas de vinculación NonPublic e Instance .
Suponiendo que tiene una instancia de Foo , f :
PropertyInfo prop = typeof(Foo).GetProperty("FooBar", BindingFlags.NonPublic | BindingFlags.Instance); MethodInfo getter = prop.GetGetMethod(nonPublic: true); object bar = getter.Invoke(f, null);Actualizar :
Si desea acceder a la propiedad Str , simplemente haga lo mismo en el objeto de la bar que se recupera:
PropertyInfo strProperty = bar.GetType().GetProperty("Str", BindingFlags.NonPublic | BindingFlags.Instance); MethodInfo strGetter = strProperty.GetGetMethod(nonPublic: true); string val = (string)strGetter.Invoke(bar, null);Hay una forma de simplificar ligeramente la respuesta de Andrew .
Reemplace las llamadas a GetGetMethod() + Invoke() con una sola llamada a GetValue() :
PropertyInfo barGetter = typeof(Foo).GetProperty("FooBar", BindingFlags.NonPublic | BindingFlags.Instance); object bar = barGetter.GetValue(f); PropertyInfo strGetter = bar.GetType().GetProperty("Str", BindingFlags.NonPublic | BindingFlags.Instance); string val = (string)strGetter.GetValue(bar); Hice algunas pruebas y no encontré ninguna diferencia, luego encontré esta respuesta , que dice que GetValue() llama a GetGetMethod() con verificación de errores, por lo que no hay una diferencia práctica (a menos que se preocupe por el rendimiento, pero al usar Reflexión supongo que no).