Passer une fonction de rappel à une autre classe

J’essaie essentiellement de passer une méthode à une autre classe pour qu’elle soit appelée plus tard, mais je ne peux pas tout comprendre en C # (je suis encore trop habitué à Objective-C).

public class Class1{ private void btn_click(object sender, EventArgs e) { ServerRequest sr = new ServerRequest(); sr.DoRequest("myrequest", myCallback); } public void myCallback(ssortingng str) { } } 

Ensuite, je veux que ma classe ServerRequest déclenche la fonction de rappel, n’est-ce pas? (Je téléphone à la maison à un serveur pour une réponse de connexion à mon logiciel)

Je n’ai pas été en mesure de trouver un moyen de faire cela avec les delegates, en permanence obtenir des erreurs. Voici l’autre classe:

 public class ServerRequest { public void DoRequest(ssortingng request, Delegate callback) { // do stuff.... callback("asdf"); } } 

Est-ce possible en #? En Objective-C, ce serait simple et je ferais juste quelque chose comme

 [myObject performSelector(@selector(MyFunctionName)) withObjects:nil]; 

Vous pouvez le passer comme Action – ce qui signifie que c’est une méthode avec un seul paramètre de type ssortingng qui ne retourne rien (void):

 public void DoRequest(ssortingng request, Action callback) { // do stuff.... callback("asdf"); } 
 public class Class1 { private void btn_click(object sender, EventArgs e) { ServerRequest sr = new ServerRequest(); sr.Callback += new ServerRequest.CallbackEventHandler(sr_Callback); sr.DoRequest("myrequest"); } void sr_Callback(ssortingng something) { } } public class ServerRequest { public delegate void CallbackEventHandler(ssortingng something); public event CallbackEventHandler Callback; public void DoRequest(ssortingng request) { // do stuff.... if (Callback != null) Callback("bla"); } } 

Vous devez d’abord déclarer le type de délégué car les delegates sont fortement typés:

 public void MyCallbackDelegate( ssortingng str ); public void DoRequest(ssortingng request, MyCallbackDelegate callback) { // do stuff.... callback("asdf"); } 

Delegate est juste la classe de base, vous ne pouvez donc pas l’utiliser comme ça. Vous pourriez faire quelque chose comme ça si:

 public void DoRequest(ssortingng request, Action callback) { // do stuff.... callback("asdf"); } 

Vous pouvez changer votre code de cette manière:

 public delegate void CallbackHandler(ssortingng str); public class ServerRequest { public void DoRequest(ssortingng request, CallbackHandler callback) { // do stuff.... callback("asdf"); } } 

Ce dont vous avez besoin est un délégué et un rappel. Voici un article MSDN intéressant qui vous montrera comment utiliser cette technique en C #.

Vous ne pouvez utiliser que des delegates, ce qui convient le mieux aux fonctions de rappel:

 public class ServerRequest { public delegate void CallBackFunction(ssortingng input); public void DoRequest(ssortingng request, CallBackFunction callback) { // do stuff.... callback(request); } } 

et consumr comme ci-dessous:

 public class Class1 { private void btn_click(object sender, EventArgs e) { ServerRequest sr = new ServerRequest(); var callback = new ServerRequest.CallBackFunction(CallbackFunc); sr.DoRequest("myrequest",callback); } void CallbackFunc(ssortingng something) { } }