Comment obtenir un délégué objet à partir d'un EventInfo?
J'ai besoin d'obtenir tous les événements de la classe courante, et de trouver les méthodes qui y souscrivent. Ici, j'ai obtenu des réponses sur la façon de le faire, mais je ne sais pas comment je peux obtenir le delegate
quand tout ce que j'ai est le EventInfo
.
var events = GetType().GetEvents();
foreach (var e in events)
{
Delegate d = e./*GetDelegateFromThisEventInfo()*/;
var methods = d.GetInvocationList();
}
Est-il possible d'obtenir un délégué auprès de l' EventInfo
? Comment?
- Citant le plus voté la réponse sur votre question précédente: "Maintenant, je suppose que vous pourriez essayer de trouver le corps de la "add" gestionnaire d', décompiler et la manière dont les gestionnaires d'événements sont en cours de stockage et de récupération de cette façon... mais merci de ne pas. Vous êtes en train de créer beaucoup de travail, juste pour briser l'encapsulation. Juste refonte de votre code de sorte que vous n'avez pas besoin de faire cela." Je suis entièrement d'accord.
Vous devez vous connecter pour publier un commentaire.
La déclaration
var events = GetType().GetEvents();
vous obtient une liste deEventInfo
des objets en lien avec le type de courant, pas l'instance actuelle en soi. Ainsi, leEventInfo
objet ne contient pas d'informations sur l'instance en cours, et donc il ne sait pas à propos de la câblé délégués.Pour obtenir les informations que vous voulez vous avez besoin pour obtenir le champ de stockage pour le gestionnaire d'événement sur votre instance en cours. Voici comment:
Alors maintenant, votre code d'appel peut ressembler à ceci:
La sortie de la ci-dessus est:
Je suis sûr que vous pouvez sauteuse avec le code si vous souhaitez retourner le délégué plutôt que de la méthode d'informations, etc.
J'espère que cette aide.
De même pour Enigmativity, l'invocation de la liste peut être trouvée pour les autres classes, et pas seulement la classe en cours...
... tant que les gestionnaires d'événements sont déclarées dans la classe, comme nous le voyons ci-dessus. Mais considérer la Contrôle classe où la EventHandlerList est stocké dans les "Événements" de la propriété et de chaque événement champ nom commence par un "Événement", suivie du nom de l'événement. Puis il y a la Forme de classes dérivées qui semblent gérer des événements encore différemment. De la nourriture pour la pensée.
Pour mon cas, la valeur du champ (de la classe
ToolStripMenuItem
, champEventClick
) frustrant est de type object, pas déléguer. J'ai dû recourir à laEvents
bien que Les mentionné dans sa réponse, dans un sens, je suis de ici. Le domaineEventClick
dans ce cas, seule détient la clé de la EventHandlerList stockées dans cette propriété.Quelques autres remarques:
fieldName = "Event" + eventName
j'ai employé ne fonctionnera pas dans tous les cas. Malheureusement, il n'existe pas de règle commune pour relier le nom de l'événement pour le nom du champ. Vous pouvez essayer d'utiliser un dictionnaire statique pour la cartographie, semblable à cet article.Je ne suis jamais tout à fait sûr de la BindingFlags. Dans un autre scénario, vous pourriez avoir à ajuster.