繁体   English   中英

使用反射获取私有财产的私有财产

[英]Get private property of a private property using reflection

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? 我知道没有什么理由可以做这样的事情(或者很少的方式),但我认为必须有办法做到这一点,我无法弄清楚如何实现它。

编辑是因为我在正文中提出的错误问题与标题中的正确问题不同

您可以将GetProperty方法NonPublicInstance绑定标志一起使用。

假设你有一个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);

我不确定是否存在实际差异,但有一种方法可以略微简化安德鲁的答案

GetValue()替换对GetGetMethod()的调用:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM