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) { } }