我为化学分析仪器编写了一个序列转换器。我将每一行视为一个对象,并将该对象的每个字段视为另一个对象。当一行添加到列表中时,我需要对某些字段对象(如订单编号)进行一些更新,因此我实现了一个指向该行中每个字段对象的委托。当我尝试克隆行对象时,问题就出现了,委托仍指向原始对象并只更新字段成员。我试图在克隆上取消注册侦听器并将其注册回来,但它仍然在原始对象上运行代码。我应该取消注册所有侦听器,然后制作克隆并将其注册回原点和克隆吗?最好的方法是什么?
第二个问题:我尝试使用Delegate.RemoveAll函数,但无法确定要传递的内容。它将目标和方法称为代表。是否有人使用过它?
答案 0 :(得分:0)
使用委托使对象成为有状态而不是无状态。要实现无状态对象,它需要自包含所有属性,以便克隆操作可以做到这一点,是克隆而不是原始。
由于它是一个有状态的对象,因此需要创建一个管理对象(或复制构造函数),它可以巧妙地遍历原始对象并重新创建新对象,而不需要原始代理但正确的那些它自己的。