Доступ к защищенному полю класса без изменения исходного класса - PullRequest
3 голосов
/ 14 марта 2012

Я использую какую-то стороннюю библиотеку, которая предоставляет некоторый тип (возвращаемый методом).

Этот тип имеет некоторые защищенные поля, которые меня интересуют, однако я не могу их использовать, поскольку их видимость защищена .

Вот упрощение проблемы:

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 ]

5 голосов
/ 14 марта 2012

Описание

Вы можете получить доступ к полю с помощью 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);
    }
}

Дополнительная информация

2 голосов
/ 14 марта 2012

Это потому, что вы на самом деле не можете получить к нему доступ.Вы не можете вызывать защищенные методы ни для какого экземпляра, кроме this (или base).Тот факт, что ваш код находится в потомке A, не означает, что это правило внезапно изменится.

Эрик Липперт имеет отличное объяснение в своем блоге: http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/why-can-t-i-access-a-protected-member-from-a-derived-class.aspx

0 голосов
/ 14 марта 2012

Наследуя от A, вы создаете новый класс (ExtendedA), который имеет член Что-то , к которому вы можете получить доступ из ExtendedA

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 .

чч,
Алан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...