使用反射获取私有属性的私有属性

本文关键字:属性 获取 反射 | 更新日期: 2023-09-27 17:54:55

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?我知道没有真正的理由去做这样的事情(或者很少有方法),但我想一定有一种方法来做这件事,我不知道如何完成它。

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

使用反射获取私有属性的私有属性

您可以将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);

有一种方法可以稍微简化Andrew的回答。

将对GetGetMethod() + Invoke()的调用替换为对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);

我做了一些测试,我没有发现差异,然后我找到了这个答案,它说GetValue()调用GetGetMethod()与错误检查,所以没有实际的差异(除非你担心性能,但当使用反射我猜你不会)。