115 votes

Transmettre 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 n'arrive pas à le faire en C# (je suis encore trop habitué à l'Objective-C).

public class Class1{

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

    public void myCallback(string str)
    {
    }
}

Plus tard, je veux que ma classe ServerRequest déclenche la fonction de rappel, n'est-ce pas possible ? (En fait, je téléphone à un serveur pour obtenir une réponse de connexion à mon logiciel).

Je n'ai pas réussi à trouver un moyen de le faire avec les délégués, j'obtiens toujours des erreurs. Voici l'autre classe :

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

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

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

171voto

BrokenGlass Points 91618

Vous pouvez le passer comme Action<string> - ce qui signifie qu'il s'agit d'une méthode avec un seul paramètre de type string qui ne renvoie rien (void) :

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

23voto

Jeroen Points 2944
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(string something)
        {

        }

    }

    public class ServerRequest
    {
        public delegate void CallbackEventHandler(string something);
        public event CallbackEventHandler Callback;   

        public void DoRequest(string request)
        {
            // do stuff....
            if (Callback != null)
                Callback("bla");
        }
    }

9voto

Wiktor Zychla Points 23918

Vous devez d'abord déclarer le type du délégué, car les délégués sont fortement typés :

public void MyCallbackDelegate( string str );

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

6voto

Nirupam Points 102

Vous pouvez utiliser uniquement des délégués, ce qui est préférable pour les fonctions de rappel :

public class ServerRequest
{
    public delegate void CallBackFunction(string input);

    public void DoRequest(string request, CallBackFunction callback)
    {
        // do stuff....
        callback(request);
    }
}

et le consommer 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(string something)
        {

        }

    }

3voto

Robbie Points 3642

Delegate n'est que la classe de base, vous ne pouvez donc pas l'utiliser de cette manière. Vous pourriez cependant faire quelque chose comme ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X