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

Nei*_*ell 12 c# events

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

我想以某种方式覆盖订阅,以便订阅实际上以相反的顺序触发.可以这样做,怎么做?

我认为这样的事情可能就是我所需要的:

public event MyReversedEvent
{
    add { /* magic! */ }
    remove { /* magic! */ }
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 19

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

例如:

private EventHandler myReversedEventField;
public event EventHandler MyReversedEvent
{
    add { myReversedEventField = value + myReversedEventField; }
    remove { myReversedEventField -= value; }
}
Run Code Online (Sandbox Code Playgroud)

remove除非要删除该处理程序的最后一个匹配项而不是第一个匹配项,否则处理程序中不需要任何魔法.(如果两次添加相同的处理程序)


Ree*_*sey 5

提出事件时,一种选择是处理此问题.您可以通过Delegate.GetInvocationList获取事件订阅者,并自己以相反的顺序调用每个代理.


Rob*_*vey 5

控制何时以及如果代理在多播代理中触发

以下方法创建一个名为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])();
    }
}
Run Code Online (Sandbox Code Playgroud)