关于设置属性成员的通知对象

时间:2011-08-02 21:12:00

标签: c# properties lua

假设我们有以下伪代码:

class XY
{
    int X { get; set; }
    int Y { get; set; }
}
class Foo
{
    XY _xy;
    XY xy
    {
        get 
        {
            return _xy;
        }
        set
        {
            Write("Foo's XY is set!");
            _xy = value;
        }
    }
}

只要我正在做

,这个工作正常
Foo foo;
foo.xy = XY(1, 3);
XY temp = foo.xy;
temp.y = 5;
foo.xy = temp;

但不适用于:

Foo foo;
foo.xy = XY(1, 3);
foo.xy.y = 5;      // no "Foo's XY is set!" here

如何实现后者?具体来说,我的意思是Lua(使用_ index / _newindex),但我正在用C#ish语言编写示例代码,因为我认为大多数人都知道它并且我认为这是更通用的编程问题。

2 个答案:

答案 0 :(得分:1)

为什么会这样?您没有设置Foo.xy。如果要实现这一点,则应该对基础对象实现某种通知。

在C#中,常见模式是在INotifyPropertyChanged上实施XY界面并为其订阅Foo

示例:

class XY: INotifyPropertyChanged
{
    public X { get {...} set { _x = value; PropertyChanged("X"); }}
    // implementation of interface...
}

class Foo
{
     public Foo(XY xy)
     {
          this._xy = xy;
          this._xy.PropertyChanged += delegate { Console.WriteLine("changed"); }
     }
}

答案 1 :(得分:0)

您实际上是在调用示例中的“getter”。这就是为什么你没有看到你的输出。

foo.xy.y = 5

您没有替换对变量的引用,而是要检索它。