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.