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

时间:2010-10-14 10:05:36

标签: c# oop setter

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

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

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

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

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

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

提前致谢

6 个答案:

答案 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();
     }
}