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

时间:2015-08-24 14:08:40

标签: c# dictionary

我想知道是否有可能访问位于对象基类及其私有的ConfigurationId属性的值。我试图用没有运气的反射来做。  enter image description here

3 个答案:

答案 0 :(得分:8)

假设以下父类和子类:

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

class ChildClass : BaseClass
{

}

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

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

答案 1 :(得分:2)

要访问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);

答案 2 :(得分:1)

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

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

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