我倾向于使用Actions将事件弹出到父对象。例如:
public class Child
{
public Action<int> onNumberChangedDelegate;
private int m_Number = 0;
public void SetNumber(int number)
{
this.m_Number = number;
if (this.onNumberChangedDelegate != null)
this.onNumberChangedDelegate(this.m_Number);
}
}
有时我需要父母将此事件转发给自己的父母:
public class Parent
{
public Action<Child, int> onChildNumberChangedDelegate;
private Child[] m_Children = new Child[];
public void SetChildren(Child[] children)
{
this.m_Children = children;
foreach (Child child in this.m_Children)
this._ConnectChildDelegate(child);
}
private void _ConnectChildDelegate(Child child)
{
child.onNumberChangedDelegate +=
(int number) => this._ChildNumberChanged(child, number);
}
private void _ChildNumberChanged(Child child, int number)
{
if (this.onChildNumberChangedDelegate != null)
this.onChildNumberChangedDelegate(child, number);
}
}
所以你可以看到我正在使用lambda表达式将孩子送入下一个Action。
我的工作流程的下一步是设置“断开连接”方法。基本上我需要Parent停止转发不再分配给它的子事件:
private void _DisconnectChildDelegate(Child oldChild)
{
child.onNumberChangedDelegate -=
(int number) => this._ChildNumberChanged(child, number);
}
不幸的是,这没有预期的(至少是我最初的预期)行为,因为它正在创建一个新的lambda表达式并试图从Action中减去它。这不会删除原始的lambda。
我的解决方法是创建一个字典:
Dictionary<Child, Action<Child, int>>
并为我需要转发的每个事件执行此操作。这样我可以在添加子项时填充字典,并在删除子项时减去生成的lambda。
所以,我的问题是:
1)我的工作流程可怕吗?这是我从PyQT采用的一种风格,所以我想它可能不属于C#。
2)有没有更好的方法让Action传递拥有它的对象?我希望有人可以告诉我,我使用的是错误的操作。
谢谢,
新村