注册/取消注册事件处理程序的通用方法

时间:2017-06-06 20:32:04

标签: c# generics

我尝试找出一种方法来保持我的事件注册和取消注册与初始化和清理同步。 我想要的是能够调用泛型方法来注册或取消注册事件,并只传递一个布尔来给出操作。

我不想使用Window,但那是一个简单的样本。

class EventSample
{
    private Window myWindow;

    public EventSample(Window window)
    {
        myWindow = window;
        InitEvent(true);
    }

    ~EventSample()
    {
        InitEvent(false);
    }

    private void InitEvent(bool register)
    {
        // I want a generic similar to that
        RegisterEvent(register, myWindow.Activated, MyWindow_Activated);
        RegisterEvent(register,myWindow.Closed , MyWindow_Closed);
        RegisterEvent(register, myWindow.Closing ,MyWindow_Closing);
    }



    private void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {

    }

    private void MyWindow_Closed(object sender, EventArgs e)
    {
    }

    private void MyWindow_Activated(object sender, EventArgs e)
    {

    }
}

1 个答案:

答案 0 :(得分:0)

我遇到过类似的清理方法问题。我通过保留处理窗口或控件时要执行的操作列表来解决这个问题。

这样的事情:

this.RegisterEvent
    ( () => this.Event += handler
    , () => this.Event -= handler
    );

RegisterEvent执行(在我的情况下延迟)事件附件:

private List<Action> unregisterEvents = new List<Action>();

private void RegisterEvent(Action registerAction, Action unregisterAction)
{
    registerAction.Invoke();

    unregisterEvents.Add(unregisterAction);
}

在处置时,只需遍历取消注册事件:

foreach (Action a in unregisterEvents)
{
    a.Invoke();
}