繁体   English   中英

使用反射获取基类的受保护属性值

[英]Get protected property value of base class using reflection

我想知道是否可以访问位于对象基类中的 ConfigurationId 属性的值,并且它是私有的。 我试图通过反思来做到这一点,但没有运气。 在此处输入图像描述

要访问 ConfigurationId 属性,我使用了以下代码:

SubsetController controller = new SubsetController(new CConfigRepository(new FakeDataContextRepository()));

var myBaseClassProtectedProperty=
            controller.GetType().BaseType
                .GetProperty("CCITenderInfo", BindingFlags.NonPublic | BindingFlags.Instance)
                .GetValue(controller);

var myProtectedProperty =
            CCITenderInfo.GetType()
                .GetProperty("ConfigurationId", BindingFlags.Public |     BindingFlags.Instance)
                .GetValue(myBaseClassProtectedProperty);

假设以下父类和子类:

class BaseClass
{
    private string privateField = "I'm Private";
}

class ChildClass : BaseClass
{

}

您可以使用反射从ChildClass实例中读取privateField的值,如下所示:

ChildClass childInstance = new ChildClass();
object privateFieldValue = childInstance.GetType().BaseType
    .GetField("privateField", BindingFlags.NonPublic | BindingFlags.Instance)
    .GetValue(childInstance);
Console.WriteLine(privateFieldValue); // I'm Private

要添加到这个答案 - 您应该肯定使用 Instance 和 NonPublic 绑定标志,但您还应该确保您实际上是在引用properties而不是fields

例如,如果你有

protected string Andrew;

无论您使用什么绑定标志,您都无法通过GetProperty获得此信息。 为什么 - 因为它是一个字段,而不是一个属性......

要解决此问题,只需将其更改为

protected string Andrew {get;set;}

然后您可以使用 GetProperty 方法。

是的,这可以通过反射实现。

但是,为了查找非公共成员,您需要使用BindingFlags参数的反射重载。 为了查找private成员,您还需要通过基类的类型进行访问,即使使用typeof也是BindingFlags.FlattenHierarchy 这也意味着您需要使用确切的绑定,但请注意,矛盾的标志(例如同时使用NonPublicPublic )是有效的,并且会在此时返回。

请注意,查找非公共成员的非常需要可能被视为代码异味,您应该非常小心地这样做。 另请注意,不保证非公共成员在不同版本中具有相同的名称。

暂无
暂无

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

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