Подтвердить что ты не робот

Передача функции обратного вызова другому классу

Я в основном пытаюсь передать метод другому классу, который будет вызываться позже, но не могу понять это на С# (я все еще слишком привык к 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)
    {
    }
}

Затем позже я хочу, чтобы мой класс ServerRequest в основном запускал функцию обратного вызова, это невозможно? (Я в основном звоню домой на сервер для ответа на вход в мое программное обеспечение)

Мне не удалось найти способ сделать это с делегатами, постоянно получать ошибки. Вот другой класс:

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

Возможно ли это в #? В Objective-C это было бы просто, и я бы просто сделал что-то вроде

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

Ответ 1

Вы можете передать его как Action<string> - это означает, что это метод с единственным параметром типа string, который не вернуть ничего (void):

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

Ответ 2

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");
        }
    }

Ответ 3

Вы должны сначала объявить тип делегата, потому что делегаты строго типизированы:

public void MyCallbackDelegate( string str );

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

Ответ 4

Delegate - это только базовый класс, поэтому вы не можете его использовать. Вы могли бы сделать что-то вроде этого:

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

Ответ 5

Вы можете изменить свой код следующим образом:

public delegate void CallbackHandler(string str);

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

Ответ 6

Вам нужен делегат и обратный вызов. Здесь - хорошая статья MSDN, которая покажет вам, как использовать эту технику на С#.