在实现IClonable. 例如:
public class A : IClonable, //INPC
{
//...
}
public class B : IClonable
{
public A PropA { get; set; }
public B()
{
PropA.PropertyChanged += a_PropertyChanged;
}
private void a_PropertyChanged()
{
//...
}
public object Clone()
{
// ????
return new B() { PropA = this.PropA.Clone() };
}
}
在这种情况下,创建的克隆B没有事件订阅。
有没有比在新对象中再次订阅事件更方便的选择?
此构造不应在克隆对象或原始对象中起作用:
在构造函数被调用的那一刻,
PropA它仍然存在于属性中null——因此,不可能订阅事件。实际上,您显然使用不同的构造函数来创建对象 B - 这就是一切正常的原因。但是当克隆停止时。
有两种方法可以解决这个问题。
方法一。
该属性应设为不可变,以防止在构造函数之外意外赋值(此赋值仍然无法正常工作):
克隆对象时,必须使用与创建对象时相同的构造函数。
方法二。
事件订阅应该在属性修改器中完成:
在这种情况下,对象 B 将监听来自“关联”对象 A 的事件,而不管是谁为它重新安装了 PropA 多少次。
在类
A中,您需要Clone()将其添加到函数中,以便事件处理程序也被重新分配: