我可以颠倒多播委托事件的顺序吗?

时间:2010-06-09 22:05:01

标签: c# events

当您订阅.NET中的事件时,订阅将添加到多播委托。触发事件时,将按订阅顺序调用委托。

我想以某种方式覆盖订阅,因此订阅实际上是以反向顺序触发的。可以这样做,怎么做?

我认为这样的事情可能就是我需要的东西?:

public event MyReversedEvent
{
    add { /* magic! */ }
    remove { /* magic! */ }
}

3 个答案:

答案 0 :(得分:19)

你不需要任何魔法;你只需要反转添加。
delegate1 + delegate2会返回一个新的委托,其中包含delegate1中的方法,后跟delegate2中的方法。

例如:

private EventHandler myReversedEventField;
public event EventHandler MyReversedEvent
{
    add { myReversedEventField = value + myReversedEventField; }
    remove { myReversedEventField -= value; }
}

remove处理程序中不需要任何魔法,除非您想删除该处理程序的最后一次出现而不是第一次出现。 (如果两次添加相同的处理程序)

答案 1 :(得分:5)

一种选择是在举起活动时处理此问题。您可以通过Delegate.GetInvocationList获取活动订阅者,然后自己以相反的顺序调用每个代表。

答案 2 :(得分:5)

Controlling When and If a Delegate Fires Within a Multicast Delegate

以下方法创建一个名为allInstances的多播委托,然后使用GetInvocationList允许以相反的顺序单独触发每个委托:

public static void InvokeInReverse()
{
    MyDelegate myDelegateInstance1 = new MyDelegate(TestInvoke.Method1);
    MyDelegate myDelegateInstance2 = new MyDelegate(TestInvoke.Method2);
    MyDelegate myDelegateInstance3 = new MyDelegate(TestInvoke.Method3);

    MyDelegate allInstances =
            myDelegateInstance1 +
            myDelegateInstance2 +
            myDelegateInstance3;

    Console.WriteLine("Fire delegates in reverse");
    Delegate[] delegateList = allInstances.GetInvocationList();
    for (int counter = delegateList.Length - 1; counter >= 0; counter--)
    {
        ((MyDelegate)delegateList[counter])();
    }
}