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

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

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

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

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

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

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

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

例如:

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

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

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