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

问题描述:

当您在.NET中订阅事件时,订阅将添加到多播委托中。当事件被触发时,代表按照他们订阅的顺序被调用。我可以颠倒多播委托事件的顺序吗?

我想以某种方式覆盖订阅,以便订购实际上在反向订单中被解雇。可以这样做,以及如何?

我觉得这样的事情可能是我需要什么?:

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

我认为订阅被解雇的订单是不确定的。 – ChrisF 2010-06-09 22:07:00

+0

@ChrisF:From MSDN ...“MulticastDelegate有一个委托链表,称为调用列表,由一个或多个元素组成,当调用多播委托时,调用列表中的委托按顺序同步调用他们出现在这里。“ – 2010-06-09 22:08:02

+0

@罗伯特 - 啊,我明确地掩饰了**多播**位 - 时间停止寻找问题来回答和睡觉。 – ChrisF 2010-06-09 22:10:40

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])(); 
    } 
} 
+0

谢谢 - 我在你发布你的答案之前自己试过了,并且得到了它的工作 - 很高兴看到我确实做了正确的事情。 :) – 2010-06-09 22:15:48

一个办法是,当你抬起事件来处理这个问题。您可以通过Delegate.GetInvocationList获得活动订阅者,并且只需按照相反顺序调用每个代理。

+0

谢谢 - 我只是在你发布你的答案之前自己试过了这个,并且得到了它的工作 - 很高兴看到我确实做了正确的事情。 :) – 2010-06-09 22:16:28

+0

@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处理任何魔法,除非你想删除处理不是第一个的最后出现。 (如果相同的处理程序被添加两次)

+0

你能扩展一下你的答案吗?很高兴看到你发布的代码的上下文,所以我可以看到我应该把它放在哪里。 – 2010-06-09 22:17:11

+0

感谢您的答案更新。 – 2010-06-09 22:19:08

+0

@Neil,这里有一些背景资料:http://www.gavaghan.org/blog/2007/07/25/intercepting-add-and-remove-of-c-event-delegates/ – 2010-06-09 22:19:44