从Action中减去lambda表达式

时间:2014-04-19 13:43:14

标签: c# lambda action

我倾向于使用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传递拥有它的对象?我希望有人可以告诉我,我使用的是错误的操作。

谢谢,

新村

0 个答案:

没有答案