2009-08-08 10 views
0

Je cet extraitDe retour d'une fonction en C#

private void westButton_click(object sender, EventArgs ea) 
{ 
    PlayerCharacter.Go(Direction.West); 
} 

répétées pour le Nord, du Sud et de l'Est.

Comment puis-je déclarer une fonction qui me permettrait de générer des méthodes comme par programmation?

par exemple, je voudrais être en mesure d'appeler

northButton.Click += GoMethod(Direction.North); 

au lieu de définir la méthode, puis

northButton.Click += new EventHandler(northButton.Click); 
+0

retour Peut-être un délégué? – eKek0

Répondre

4
northButton.Click += (s, e) => GoMethod(Direction.North); 

(ou ...)

northButton.Click += (s, e) => PlayerCharacter.Go(Direction.North); 
0
northButton.Click += (s,e) => GoMethod(Direction.North); 
+0

() => PlayerCharacter.Go (Direction.North) –

+2

Comment ajoutez-vous une expression lambda qui ne prend aucun paramètre à un événement en tant que gestionnaire qui attend un délégué qui prend deux paramètres: object et EventArgs? Il doit être (s, e) => PlayerCharacter.Go (Direction.North) ou delegate {PlayerCharacter.Go (Direction.North);} –

0

Il me semble avoir trouvé une solution:

private EventHandler GoMethod(Direction dir) 
{ 
    return new EventHandler((object sender, EventArgs ea) => PlayerCharacter.Go(dir)); 
} 

Ma seule préoccupation serait de relier ti moi; si PlayerCharacter est null quand j'appelle GoMethod, que se passerait-il?

+1

Les variables PlayerCharacter et dir sont capturées (fermées) avec une fermeture. Le compilateur va générer du code supplémentaire en coulisse pour les "hisser" dans leur propre classe et instance privée afin qu'ils conservent leur état au moment de l'exécution de ce code. –

Questions connexes