假设我们有以下伪代码:
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语言编写示例代码,因为我认为大多数人都知道它并且我认为这是更通用的编程问题。
答案 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
您没有替换对变量的引用,而是要检索它。