2010-10-14 114 views
1

我試圖創建一個類(在C#中)作爲我的應用程序的環境。限制對特定對象的公共setter訪問(C#)

我試圖讓這個類變成動態的,並將它作爲參數發送給我的應用程序中的實體。問題是,我希望能夠更改此環境類(公用設置器)的屬性,但同時我希望接收該環境的類無法使用這些設置器。

我似乎無法找到一個很好的方式來描述我的問題(我認爲這是我在Google或msdn上找不到像這樣的任何東西的原因的一部分),但是很快就會出現,我想要創建一個帶有setter的類,這些setter只爲我的一些對象公開,而不是全部爲

我現在很喜歡以下想法: 避免公共設置者一起使用事件註冊公開私有字段。

該類將註冊到新的第三個對象中的事件(作爲參數發送給構造函數)。由環境註冊的方法並不比設置者多,因此觸發這些事件將「允許訪問」私有字段。我喜歡一些想法(因爲我覺得我的並不是那麼棒),或者更好一些,我可以利用一些模式。

在此先感謝

回答

1

你可以創建一個代理,並將該代理髮送給你的實體類。

class MyClass 
{ 
    public int MyProperty { get; set; } 
} 

class MyProxyClass 
{ 
    public MyProxyClass(MyClass myClass) 
    { 
     _myClass = myClass; 
    } 

    private MyClass _myClass; 

    public int MyProperty 
    { 
     get { return _myClass.MyProperty; } 
    } 
} 
3

不是「內部」足以讓你需要什麼?

你可以將setter移動到一個接口中作爲顯式實現。然後他們從公共界面被隱藏,並且只有在您投射到界面時纔可以訪問。

如果你想確保沒有其他人可以調用它,你可以添加一些參數給這些函數,你期望某個只給予可信類的特定標記對象。

void SetX(int value, object token) 
{ 
    if(token!=correctToken) 
     throw new ArgumentException("wrong token"); 
    x=value; 
} 
+0

我想我會用這種方法畢竟。我需要做一些工作來使這些代碼不言自明,但這是我現在可以想到的最佳選擇。謝謝! – Neowizard 2010-10-14 11:32:53

0

也許我理解的東西不是很好,但我認爲喬恩度過了一個非常類似的問題,這he described here。也許這可以幫助你。

1

您可以嘗試使用Friend組件。這將只允許你指定的程序集訪問你的私人(snicker)。

0

如何

class Callee 
{ 
    public void SetX(TypeOfCaller caller, int value) 
    { 
    } 
} 
class TypeOfCaller 
{ 
    public void Do() 
    { 
     Callee instance; 
     //.. 
     instance.SetX(this, 5); 
    } 
} 

這樣做;您還可以使用Visual Studio的「查找參考」功能!如果你想要多種類型的呼叫者;你可以選擇類層次結構,或者只需要超載

0

爲什麼不能返回受保護對象的克隆而不是實際的對象?解決問題而不會增加任何複雜性。

public class MyService 
{ 
    private List<MyObject> _protectedObjects = new List<MyObject>(); 

    public MyObject GetItem(int id) 
    { 
     return (MyObject)_protectedObjects.First(i => i.Id == id).Clone(); 
    } 
} 

public class MyObject : ICloneable 
{ 
    //[...] 
    public object Clone() 
    { 
     return MemberwiseClone(); 
    } 
}