Lorsque vous vous abonnez à un événement dans .NET, l'abonnement est ajouté à un délégué de multidiffusion. Lorsque l'événement est tiré, les délégués sont appelés dans l'ordre dans lequel ils étaient souscrits.
J'aimerais remplacer l'abonnement, de sorte que les abonnements soient effectivement tirés dans la commande forte> inverse forte>. Peut-on être fait et comment? P>
Je pense que quelque chose comme ça pourrait être ce dont j'ai besoin?: P>
public event MyReversedEvent { add { /* magic! */ } remove { /* magic! */ } }
3 Réponses :
Une option serait de gérer cela lorsque vous soulevez l'événement. Vous pouvez obtenir les abonnés d'événements via déléguée.getinVocationList et appelez simplement chaque délégué dans l'ordre inverse vous-même. P>
Merci - je me suis essayé moi-même juste avant de poster votre réponse et de le faire fonctionner - bien de voir la confirmation que j'ai fait la bonne chose. :)
@Slaks: intéressant. Merci - n'avait pas utilisé les opérateurs de délégués de cette façon avant ...
La méthode suivante crée un délégué de multidiffusion appelé AllInstances, puis Utilise GetInvocactList pour permettre à chaque délégué d'être tiré individuellement, dans l'ordre inverse: p>
Merci - je me suis essayé moi-même juste avant de poster votre réponse et de le faire fonctionner - bien de voir la confirmation que j'ai fait la bonne chose. :)
Vous n'avez pas besoin de magie; Vous avez juste besoin d'inverser l'addition. Par exemple: p> Vous n'avez pas besoin de magie dans le gestionnaire code> Supprimer code>, sauf si vous souhaitez supprimer la dernière occurrence de ce gestionnaire au lieu du premier. (Si le même gestionnaire a été ajouté deux fois) p> p>
Écrire Délégué1 + Délégate2 Code> renvoie un nouveau délégué contenant la méthode (s) de la méthode (s) dans
Délégué1 code> suivie des méthodes dans
Délégate2 code>.
Pouvez-vous développer un peu votre réponse, s'il vous plaît? Il serait bon de voir le contexte autour du code que vous avez posté afin que je puisse voir où je devrais le mettre.
@Neil, quelques informations de base ici: Gavaghan.org/blog/2007/07/25/...
Je pensais que l'ordre des abonnements a été licencié était indéterminé.
@ChRISF: de MSDN ... "Un MulticastDelegate a une liste liée des délégués, appelée liste d'invocation, composée d'un ou plusieurs éléments. Lorsqu'un délégué multidiffusion est invoqué, les délégués de la liste d'invocation sont appelés synchroneusement dans l'ordre qu'ils apparaissent. "
@ROBERT - Ah, j'ai clairement glacé sur la multidiffusion MultiCast B> Temps de temps pour arrêter de rechercher des questions pour répondre et aller au lit.
Puis-je demander pourquoi? Cela n'a pas beaucoup de sens pour moi. Cela ne crée-t-il pas une logique étroite entre l'éditeur et les abonnés, qui est la chose exacte que ce modèle est destiné à éviter?
Bien que vous puissiez trouver des moyens de le faire. J'aimerais toujours connaître la raison pour laquelle vous devez faire cela !!! À ma compréhension, l'ordre dans lequel les événements sont traités par divers objets ne devraient pas être basés sur aucune commande et ne devrait être basé sur aucune logique.