我可以颠倒多播委托事件的顺序吗?
当您在.NET中订阅事件时,订阅将添加到多播委托中。当事件被触发时,代表按照他们订阅的顺序被调用。我可以颠倒多播委托事件的顺序吗?
我想以某种方式覆盖订阅,以便订购实际上在反向订单中被解雇。可以这样做,以及如何?
我觉得这样的事情可能是我需要什么?:
public event MyReversedEvent
{
add { /* magic! */ }
remove { /* magic! */ }
}
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])();
}
}
谢谢 - 我在你发布你的答案之前自己试过了,并且得到了它的工作 - 很高兴看到我确实做了正确的事情。 :) – 2010-06-09 22:15:48
一个办法是,当你抬起事件来处理这个问题。您可以通过Delegate.GetInvocationList获得活动订阅者,并且只需按照相反顺序调用每个代理。
谢谢 - 我只是在你发布你的答案之前自己试过了这个,并且得到了它的工作 - 很高兴看到我确实做了正确的事情。 :) – 2010-06-09 22:16:28
@SLaks:有趣。谢谢 - 以前没有用过这种方式的代表操作员...... – 2010-06-10 00:40:52
你不需要任何魔法;你只需要扭转添加。
书写delegate1 + delegate2
返回一个新委托,其中包含delegate1
中的方法,然后是delegate2
中的方法。
例如:
private EventHandler myReversedEventField;
public event EventHandler MyReversedEvent
{
add { myReversedEventField = value + myReversedEventField; }
remove { myReversedEventField -= value; }
}
你并不需要在remove
处理任何魔法,除非你想删除处理不是第一个的最后出现。 (如果相同的处理程序被添加两次)
你能扩展一下你的答案吗?很高兴看到你发布的代码的上下文,所以我可以看到我应该把它放在哪里。 – 2010-06-09 22:17:11
感谢您的答案更新。 – 2010-06-09 22:19:08
@Neil,这里有一些背景资料:http://www.gavaghan.org/blog/2007/07/25/intercepting-add-and-remove-of-c-event-delegates/ – 2010-06-09 22:19:44
我认为订阅被解雇的订单是不确定的。 – ChrisF 2010-06-09 22:07:00
@ChrisF:From MSDN ...“MulticastDelegate有一个委托链表,称为调用列表,由一个或多个元素组成,当调用多播委托时,调用列表中的委托按顺序同步调用他们出现在这里。“ – 2010-06-09 22:08:02
@罗伯特 - 啊,我明确地掩饰了**多播**位 - 时间停止寻找问题来回答和睡觉。 – ChrisF 2010-06-09 22:10:40