限制对特定对象的公共setter访问(C#)

我正在尝试创建一个类(在C#中)作为我的应用程序的环境。

我正在尝试使类动态化,并将其作为参数发送到我的应用程序中的实体。 问题是,我希望能够更改此环境类(公共setter)的属性,但同时我希望接收环境的类无法使用这些setter。

我似乎无法找到一个很好的方式来表达我的问题(我认为这是我在谷歌或msdn上找不到这样的原因的一部分),但是很快, 我想创建一个类, setter只对我的某些对象公开,而不是对所有对象都公开

我目前正在尝试以下想法:避免公共设置器一起使用,并使用事件注册公开私有字段。

该类将在新的第三个对象中注册事件(作为参数发送到构造函数)。 将由环境注册的方法不仅仅是setter,因此触发这些事件将“允许访问”私有字段。

我喜欢一些想法(因为我觉得我的想法并不是那么好),或者更好的是我可以利用的一些模式。

提前致谢

您可以创建代理,并将该代理发送到您的实体类。

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

“内部”不足以满足您的需求吗?

您可以将setter作为显式实现移动到接口中。 然后,它们从公共接口隐藏,只有在转换为界面时才可访问。

如果你想确定没有其他人可以调用它,你可以在这些函数中添加一些参数,你期望某个令牌对象只能提供给受信任的类。

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

您可以尝试使用Google朋友程序集。 这将只允许您指定的程序集访问您的私有(snicker)。

也许我理解的东西不太好,但我认为Jon有一个非常类似的问题, 他在这里描述 。 也许这可以帮到你。

怎么样

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

这样做; 您还可以使用Visual Studio的“查找引用”function! 如果你想要多种类型的来电者; 您可以选择类层次结构,也可以只需要重载

为什么不返回受保护对象的克隆而不是实际对象? 解决问题而不增加任何复杂性。

 public class MyService { private List _protectedObjects = new List(); public MyObject GetItem(int id) { return (MyObject)_protectedObjects.First(i => i.Id == id).Clone(); } } public class MyObject : ICloneable { //[...] public object Clone() { return MemberwiseClone(); } }