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的FooBar?我知道没有任何理由去做这样的事情(或者很少的方式),但我认为必须有办法做到这一点,我无法弄清楚如何实现它。
编辑,因为我在正文中提出的错误问题与标题中的正确问题不同
答案 0 :(得分:15)
您可以使用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);
更新:
如果要访问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);
答案 1 :(得分:0)
我不确定是否存在实际差异,但是有一种方法可以稍微简化Andrew's answer。
用GetGetMethod()
代替对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);