当您订阅.NET中的事件时,订阅将添加到多播委托。触发事件时,将按订阅顺序调用委托。
我想以某种方式覆盖订阅,因此订阅实际上是以反向顺序触发的。可以这样做,怎么做?
我认为这样的事情可能就是我需要的东西?:
public event MyReversedEvent
{
add { /* magic! */ }
remove { /* magic! */ }
}
答案 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])();
}
}