访问类受保护的字段而不修改原始类

时间:2012-03-14 08:26:51

标签: c# .net oop

我正在使用一些暴露某种类型的第三方库(由方法返回)。

此类型有一些我感兴趣的受保护字段,但我无法使用它们,因为它们的可见性受保护

以下是问题的简化:

public class A
    {
        protected object Something;

        public A Load()
        {
            return new A();
        }
    }

    public class ExtendedA : A
    {
        public void DoSomething()
        {
            // Get an instance.
            var a = Load();

            // Access protected fields (doesn't compile).
            a.Something = ....
        }
    }

有没有简单的方法来实现这个目标?

3 个答案:

答案 0 :(得分:5)

描述

您可以使用this.Something访问该字段,因为您的课程源自class A

如果要创建class A的实例,而不是派生类,则只能使用反射访问该字段。

使用Reflection的样本

public class ExtendedA : A
{
    public void DoSomething()
    {
        // Get an instance.
        var a = Load();

        //get the type of the class
        Type type = a.GetType();
        BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;

        // get the field info
        FieldInfo finfo = type.GetField("Something", bindingFlags);

        // set the value 
        finfo.SetValue(a, "Hello World!");

        // get the value
        object someThingField = finfo.GetValue(a);
    }
}

更多信息

答案 1 :(得分:2)

那是因为你实际上无法访问它。 您无法在this(或base)以外的任何实例上调用受保护的方法。 仅仅因为您的代码恰好位于A的后代并不意味着此规则突然发生变化。

Eric Lippert在他的博客中有一个很好的解释: http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/why-can-t-i-access-a-protected-member-from-a-derived-class.aspx

答案 2 :(得分:0)

通过从A继承,您可以创建一个新类(ExtendedA),其中包含可以从ExtendedA中访问的成员 Something

public class ExtendedA : A 
{ 
    public void DoSomething() 
    { 

        // works fine
        this.Something = .... 
    } 
} 

继承不会让您能够进入A的实例来改变某事

public class ExtendedA : A 
{ 
    public void DoSomething() 
    { 
        var a = new A();

        // access level error
        a.Something = .... 
    } 
} 

如果您想使用 Something 值,您可以在ExtendedA中执行此操作,但仅限于ExtendedA实例自己的 Something 副本。

hth,
艾伦。