2012-01-19 87 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