2010-10-17 5 views
1

J'ai un tas de boutons sur mon formulaire, et à un certain point dans mon code je veux forcer l'événement Click à tirer. Je pourrais faire quelque chose comme ceci:C#: Comment appeler un événement en utilisant la réflexion?

if (myButton == btnFoo) 
    btnFoo_Click(this, new EventArgs()); 
else if (myButton == btnBar) 
    btnBar_Click(this, new EventArgs()); 
else if // blah blah 
    ... 

De toute évidence, ce n'est pas idéal. Cela ressemble à un cas de réflexion, mais je ne peux pas trouver la bonne méthode pour le faire, par exemple.

var ei = myButton.GetType().GetEvent("Click"); // so far so good; 
var mi = ei.GetRaiseMethod(); // always returns null - no good! 

Documentation pour GetRaiseMethod. Comment puis-je forcer le code de clic à s'exécuter?

+0

A partir de cette même page. « Cette méthode renvoie null pour les événements déclarés avec le mot-clé événement C# ou le mot-clé Visual Basic Event En effet, le Les compilateurs C# et Visual Basic ne génèrent pas une telle méthode. " –

Répondre

3

Utilisez la méthode PerformClick:

myButton.PerformClick(); 

Peut-être que vous avez à jeter Button, je ne peux pas dire de votre extrait. Je suppose que vous n'aurez plus besoin de poursuivre le code de réflexion :)

+0

+1: Oh, beaucoup mieux. Je ne savais pas de cette méthode. – Ani

+0

Je ne l'avais pas repéré non plus. Je pense que je vais quand même remettre en question la conception générale en général - il vaut la peine de lui donner une autre chance de voir s'il y a une approche plus propre. –

4

En général, vous ne pouvez pas. Le but d'un événement est de permettre aux clients de s'abonner et de se désabonner - l'éditeur devrait être responsable de l'événement. Le fait qu'il y ait est et GetRaiseMethod est un peu bizarre à mon avis - et non pris en charge en C# (vous ne pouvez spécifier que des méthodes d'ajout/suppression).

Une alternative est d'avoir un Dictionary<Button, EventHandler> ou quelque chose de semblable, et inscrivez-vous là-bas tous les gestionnaires d'événements aussi ... mais vous voudrez peut-être réfléchir sur pourquoi vous voulez forcer l'événement click pour tirer efficacement en premier lieu . Peut-être y a-t-il une meilleure conception qui éviterait que ce soit un problème.

+1

Par conséquent, le GetRaiseMethod() ne fonctionne pas pour les événements générés par C#, il fonctionne uniquement avec le code dynamique qui utilise également SetRaiseMethod(). Si vous utilisez GetRaiseMethod() sur des objets générés en C#, vous aurez toujours 'null '. – Doug

0

Jon Skeet a raison; en ce qui concerne le "contrat", il y a une méthode add et remove, et c'est à peu près tout. En effet, il n'y a aucune garantie que l'événement soit implémenté en tant qu'événement "de type champ" avec un délégué multidiffusion de backing. Il pourrait y avoir à peu près n'importe quelle structure de données de sauvegarde pour stocker chaque rappel (ou pas du tout). Par conséquent, "lever un événement" sur un objet est en général pas bien défini.

Editer: Suggestion supprimée basée sur la réflexion. Allez avec @Hans Passant.

1

J'ai un problème similaire. J'ai un contrôle qui déclenche un événement click quand on clique dessus. Je veux augmenter l'événement quand une touche de raccourci est pressée, ceci étant surveillé par un composant sur mon formulaire. Pour y parvenir, j'ai ajouté le code suivant à mon contrôle personnalisé.

public void PerformClick() 
{    
    OnClick(new EventArgs()); 
} 

Je puis cliquez sur le bouton en utilisant

ctl.PerformClick(); 
Questions connexes