C# 在不修改原始类的情况下访问受类保护的字段

C# 在不修改原始类的情况下访问受类保护的字段,c#,.net,oop,C#,.net,Oop,我使用的第三方库公开了一些类型(由方法返回) 这种类型有一些我感兴趣的受保护字段,但是我无法使用它们,因为它们的可见性受保护 以下是问题的简化: public class A { protected object Something; public A Load() { return new A(); } } public class ExtendedA : A {

我使用的第三方库公开了一些类型(由方法返回)

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

以下是问题的简化:

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 = ....
        }
    }
有什么简单的方法可以做到这一点吗?

说明 您可以使用
this.Something
访问该字段,因为您的类派生自
类A

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

使用反射进行采样 更多信息

    • 这是因为您实际上无法访问它。 除了
      this
      (或
      base
      )之外,您不能在任何实例上调用受保护的方法。 仅仅因为您的代码恰好位于的子代中,并不意味着此规则会突然更改

      Eric Lippert在他的博客中有一个很好的解释:

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

      public class ExtendedA : A 
      { 
          public void DoSomething() 
          { 
      
              // works fine
              this.Something = .... 
          } 
      } 
      
      继承不会使您能够访问某个实例来更改某些内容

      public class ExtendedA : A 
      { 
          public void DoSomething() 
          { 
              var a = new A();
      
              // access level error
              a.Something = .... 
          } 
      } 
      
      如果要使用Something值,可以在ExtendedA中使用,但只能在ExtendedA实例自己的Something副本上使用

      hth,

      Alan.

      编译器的错误消息是什么?我不明白,字段是受保护的,但当您从该类派生时,仍然无法访问成员?在实例**上调用
      .Something
      a
      之间有很大区别;这就是为什么受保护的服务器不允许您访问。Eric Lippert有一系列关于“为什么我不能从派生类访问受保护的成员?”-搜索它们?问题是我需要访问特定实例上的字段,而不是“this”如果已知值的类型与代码出现的类的类型相同或派生自该类的类型,则可以对除
      this
      base
      以外的值调用受保护的方法。例如,如果基类B具有受保护的方法M(),那么派生类D可以调用(新的D()).M()。@EricLippert:我再次发现自己在阅读我指向的一篇博客文章,以了解真正发生的事情。谢谢:)不客气。还要注意的是,这篇原创文章还衍生了六篇文章,探讨了这条规则的各个方面。看看他们有多少人。干杯!我读了你的博客已经有一段时间了,非常喜欢。我是一个狂热的读者,很显然,很遗憾,我的阅读还不够透彻:)
      public class ExtendedA : A 
      { 
          public void DoSomething() 
          { 
              var a = new A();
      
              // access level error
              a.Something = .... 
          } 
      }