将回调函数传递给另一个类


90

我基本上是想将一个方法传递给另一个类,以供稍后调用,但是在C#中我还不太清楚(我仍然很习惯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];

Answers:


139

您可以将其传递为Action<string>-,这意味着它是一个带有单个参数类型的方法,该方法string不返回任何值(无效):

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

您如何称呼DoRequest?您传递字符串还是方法?
Kokodoko

1
对于其他对动作感到好奇的人。这是一个快速提示。它可以有多个类型参数,但是没有返回值(仅用于传递c#成员Action <type1,.. typeN>不允许在类型上使用修饰符要传递函数,请再次使用Func <typeList>在任何类型上都不能使用修饰符,最后一个类型list实际上是函数的返回类型Action和Func是使用简单委托的快速方法
gg89 2015年

让我的一天变得简单干净!
isanjosgon

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

10

您必须首先声明委托的类型,因为委托是强类型的:

public void MyCallbackDelegate( string str );

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

如果您在代码的很多地方都使用相同的方法签名,那么这是一个很好的解决方案。
mtmurdock 2012年

4
最好在调用回调方法之前始终检查其是否为null。
Maciej 2012年

4

Delegate只是基类,所以您不能那样使用它。您可以执行以下操作:

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

2
Func<string>将是一个返回字符串的方法-您需要使用Action<string>
BrokenGlass 2012年

@BrokenGlass您说得对,我很不好-已更新(我为您的答案+1)
Robbie

3

您可以通过以下方式更改代码:

public delegate void CallbackHandler(string str);

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

2

您需要的是一个委托和一个回调。是一篇不错的MSDN文章,将向您展示如何在C#中使用此技术。


2

您只能使用最适合回调函数的委托:

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

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

并像下面这样消费:

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

        }


    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.