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

Gee*_*esu 87 c#

我基本上试图将一个方法传递给另一个稍后要调用的类,但是在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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我希望我的ServerRequest类基本上触发回调函数,这是不可能的?(我基本上打电话给服务器,以便对我的软件进行登录响应)

我无法找到与代表这样做的方法,不断得到错误.这是另一个类:

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

这可能在#?在Objective-C中,这很简单,我会做类似的事情

[myObject performSelector(@selector(MyFunctionName)) withObjects:nil];
Run Code Online (Sandbox Code Playgroud)

Bro*_*ass 135

您可以将其作为传递Action<string>- 这意味着它是一个具有单个参数类型string但不返回任何内容的方法(void):

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

  • 对于其他对 Action 感到好奇的人。这是一个快速提示。它可以有多个类型参数但没有返回(仅用于传递 c# 成员 Action&lt;type1,..,typeN&gt; 不允许在类型上使用修饰符要传递函数,请再次使用 Func&lt;typeList&gt; 对任何类型中的最后一个类型无修饰符list 是函数返回类型,实际上 Action 和 Func 是使用简单委托的快捷方式 (2认同)

Jer*_*oen 22

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");
        }
    }
Run Code Online (Sandbox Code Playgroud)


Wik*_*hla 9

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

public void MyCallbackDelegate( string str );

public void DoRequest(string request, MyCallbackDelegate callback)
{
     // do stuff....
     callback("asdf");
}
Run Code Online (Sandbox Code Playgroud)

  • 在调用它之前总是检查回调方法是否为null是一个好习惯. (4认同)

Mar*_*rco 5

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

public delegate void CallbackHandler(string str);

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


小智 5

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

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

    public void DoRequest(string request, CallBackFunction callback)
    {
        // do stuff....
        callback(request);
    }
}
Run Code Online (Sandbox Code Playgroud)

并像下面这样消费:

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

        }


    }
Run Code Online (Sandbox Code Playgroud)