una que librería eventos evento ejemplos crear biblioteca c# events

c# - que - ¿Puedo revertir el orden de un evento delegado de multidifusión?



eventos en c# ejemplos (3)

No necesitas magia. solo necesitas invertir la suma.
Escribir delegate1 + delegate2 devuelve un nuevo delegado que contiene el método (s) en delegate1 seguido de los métodos en delegate2 .

Por ejemplo:

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

No necesita ninguna magia en el controlador de remove , a menos que desee eliminar la última ocurrencia de ese controlador en lugar de la primera. (En caso de que se haya agregado el mismo controlador dos veces)

Cuando se suscribe a un evento en .NET, la suscripción se agrega a un delegado de multidifusión. Cuando se dispara el evento, se llama a los delegados en el orden en que se suscribieron.

Me gustaría sobrescribir la suscripción de alguna manera, para que las suscripciones realmente se activen en el orden inverso . ¿Se puede hacer esto, y cómo?

¿Creo que algo como esto podría ser lo que necesito ?:

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


Controlar cuándo y si un delegado dispara dentro de un delegado de multidifusión

El siguiente método crea un delegado de multidifusión llamado allInstances y luego usa GetInvocationList para permitir que cada delegado se active individualmente, en orden inverso:

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


Una opción sería manejar esto cuando plantee el evento. Puede obtener los suscriptores del evento a través de Delegate.GetInvocationList , y simplemente llame a cada delegado en orden inverso usted mismo.