代码之家  ›  专栏  ›  技术社区  ›  Neowizard

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

  •  1
  • Neowizard  · 技术社区  · 15 年前

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

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

    我似乎找不到一个好的方式来表达我的问题(我想这也是我在Google或msdn上找不到类似问题的部分原因),但是简单地说, 我想用setter创建一个类,它只对我的一些对象公开,而不是对所有对象公开

    我现在有一个有趣的想法: 避免将公共setter放在一起,并使用事件注册公开私有字段。

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

    6 回复  |  直到 15 年前
        1
  •  1
  •   devnull    15 年前

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

    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; }
        }
    }
    
        2
  •  3
  •   CodesInChaos    15 年前

    “内部”不足以满足你的需要吗?

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

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

    void SetX(int value, object token)
    {
        if(token!=correctToken)
            throw new ArgumentException("wrong token");
        x=value;
    }
    
        3
  •  1
  •   tmont    15 年前

    你可以试着用 Friend

        4
  •  0
  •   Oliver    15 年前

    也许我理解得不太好,但我想乔恩也有类似的问题 he described here . 也许这能帮到你。

        5
  •  0
  •   gts    15 年前

    怎么样

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

    这样做;您还可以使用Visual Studio的“查找引用”功能!如果需要多种类型的调用方,可以选择类层次结构,也可以简单地使用所需的重载

        6
  •  0
  •   jgauffin    15 年前

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