2011-11-24 28 views
2

我正在尋找一個內部類的屬性的可見性修飾符,它允許外部類修改/設置值,但外部類只能讀取/讀取值。內部類成員/屬性可見性(C#)

public class Outer { 
    public class Inner { 
     // I want this to be editable by Outer instances 
     // but read-only to other external classes. 
     public string attribute; 
    } 
} 

回答

4

您不必爲訪問修飾符,但你可以用這樣的僥倖:

public class Outer 
{ 
    private static Action<Inner, string> InnerAttributeSetter; 

    public class Inner 
    { 
     static Inner() 
     { 
      Outer.InnerAttributeSetter = (inner, att) => inner.Attribute = att; 
     } 

     public string Attribute { get; private set; } 
    } 

    public Outer() 
    { 
     var inner = new Inner(); 

     InnerAttributeSetter(inner, "Value"); 

     Console.WriteLine(inner.Attribute); 
    } 
} 

基本上你考慮一個事實,即嵌套類具有優勢獲得private成員併爲封閉類提供代理,以便爲給定的Inner實例設置attribute屬性。由於外部類無法訪問此代理,因此您滿足了您的要求。

+0

如何讓私有內部類擴展公共內部類並在私有類上具有實際設置公共類屬性的屬性? – diolemo

+0

就黑客而言,我更喜歡基於代理的方法,不會混合繼承,但如果它起作用,最終的選擇就是你的。 –

+0

有沒有辦法使這個工作與其他數據類型的屬性?您的示例僅適用於字符串。 – diolemo

0

由於內部類成員/屬性不是靜態的,所以無法保存或修改該成員的狀態。

我認爲約翰安傑洛的例子最接近你能得到的。