2012-01-19 119 views
2

比方說,我有一個類,它有一個屬性隱藏它的基本屬性和嵌套類在這個類內。是否有可能訪問基地隱藏 * 虛擬 *屬性來自嵌套類?從嵌套類訪問外部類隱藏的基本屬性

下面是一個例子:

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; 
} 

編輯:

爲了使這項工作中,BaseClassSomeProperty酒店到嵌套類,無論是通過使可訪問它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