我正在尝试创建一个用作应用程序环境的类(在C#中)。
我正在尝试使该类动态化,并将其作为参数发送给我的应用程序中的实体。问题是,我希望能够更改此环境类(公共setter)的属性,但同时我希望接收环境的类无法使用这些setter。
我似乎无法找到一个很好的方式来表达我的问题(我认为这是我在谷歌或msdn上找不到类似内容的原因的一部分),但是很快,我想创建一个具有setter的类,这些setter仅对我的某些对象公开,而不是对所有对象公开。
我目前正在尝试以下想法: 一起避免公共设置者,并使用事件注册公开私有字段。
该类将在新的第三个对象中注册事件(作为参数发送到构造函数)。将由环境注册的方法不比设置者多,因此触发这些事件将“允许访问”私有字段。
我喜欢一些想法(因为我觉得我的想法并不是那么好),或者更好的是我可以利用的一些模式。
提前致谢
答案 0 :(得分:3)
“内部”不足以满足您的需求吗?
您可以将setter作为显式实现移动到接口中。然后它们在公共界面中隐藏,只有在转换为界面时才可访问。
如果你想确定没有其他人可以调用它,你可以在这些函数中添加一些参数,你期望某个令牌对象只能提供给可信任的类。
void SetX(int value, object token)
{
if(token!=correctToken)
throw new ArgumentException("wrong token");
x=value;
}
答案 1 :(得分:1)
您可以尝试使用Friend程序集。这将只允许您指定的程序集访问您的私有(snicker)。
答案 2 :(得分: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 :(得分:0)
也许我理解的东西不太好,但我认为Jon有一个非常类似的问题he described here。也许这可以帮到你。
答案 4 :(得分:0)
怎么样
class Callee
{
public void SetX(TypeOfCaller caller, int value)
{
}
}
class TypeOfCaller
{
public void Do()
{
Callee instance;
//..
instance.SetX(this, 5);
}
}
这样做;您还可以使用Visual Studio的“查找引用”功能!如果你想要多种类型的来电者;你可以选择类层次结构,也可以只需要重载
答案 5 :(得分: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();
}
}