2012-01-19 3 views
2

Предположим, у меня есть класс, у которого есть свойство, скрывающее его базовое свойство и вложенный класс внутри этого класса. Можно ли получить доступ к базе скрыто * virtual * свойство из вложенного класса?Доступ к внешнему классу скрытого базового свойства из вложенного класса

Вот пример:

class BaseClass 
{ 
    protected virtual String SomeProperty {get; set;} 
} 

class Inherited : BaseClass 
{ 
    protected new String SomeProperty {get; set;} 

    class Nested 
    { 
     Inherited parent; 
     public Nested(Inherited parent) 
     { 
      this.parent = parent; 
     } 

     public void SomeMethod() 
     { 
      //How do I access the SomeProperty which belongs to the BaseClass? 
     } 
    } 
} 

Единственное решение, которое я могу думать о том, чтобы добавить частный метод унаследованного класса, который возвращает base.SomeProperty Есть ли лучшее решение?

+0

Где вы пытаетесь получить к нему доступ, и почему вы скрыли эту недвижимость в первую очередь? –

+0

Я пытаюсь получить к нему доступ из метода вложенного класса. Я скрыл базовое свойство, потому что новое свойство предоставляет больше возможностей, чем базовое свойство, и я не хочу иметь два свойства. – Giorgi

ответ

5

Вы можете указать InheritedClass ссылку на BaseClass. Поскольку вы скрываете базовое свойство вместо его переопределения, это должно сделать трюк.

public void SomeMethod() 
{ 
    BaseClass baseRef = parent; 
    // do stuff with the base property: 
    baseRef.SomeProperty = someValue; 
} 

Edit:

Чтобы сделать эту работу, то SomeProperty свойство BaseClass должен быть доступен для вложенного класса, либо сделав его internal (если вы не хотите, чтобы сделать свойство, доступное за пределами объявляющей сборки) или protected internal (если вы хотите разрешить переопределение в производных классах из других сборок).

Если оба параметра не указаны (т. Е. Когда ваш производный класс уже находится в другой сборке), вы не сможете обойти объявить свойство оболочки.

private string SomeBaseProperty 
{ 
    get 
    { 
     return base.SomeProperty; 
    } 

    set 
    { 
     base.SomeProperty = value; 
    } 
} 
+0

Спасибо за ваш ответ, я забыл, что свойство действительно виртуально. Я обновил свой вопрос. – Giorgi

+0

До тех пор, пока вы все еще используете затенение, мое решение все равно будет работать;) – Nuffin

+2

Это вызывает ошибку компилятора CS1540: не удается получить доступ к члену защищенного члена через квалификатор типа 'type1'; квалификатор должен быть типа «type2» (или получен из него). http://msdn.microsoft.com/en-us/library/s9zta243.aspx – Giorgi

Смежные вопросы