2010-10-14 119 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(); 
    } 
}