我基本上试图将一个方法传递给另一个稍后要调用的类,但是在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];
答案 0 :(得分:127)
您可以将其作为Action<string>
传递 - 这意味着它是一个类型string
的单个参数不返回任何内容的方法(void):
public void DoRequest(string request, Action<string> callback)
{
// do stuff....
callback("asdf");
}
答案 1 :(得分:20)
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");
}
}
答案 2 :(得分:9)
您必须首先声明委托的类型,因为委托是强类型的:
public void MyCallbackDelegate( string str );
public void DoRequest(string request, MyCallbackDelegate callback)
{
// do stuff....
callback("asdf");
}
答案 3 :(得分:4)
Delegate
只是基类,所以你不能那样使用它。你可以这样做:
public void DoRequest(string request, Action<string> callback)
{
// do stuff....
callback("asdf");
}
答案 4 :(得分:3)
您可以通过以下方式更改代码:
public delegate void CallbackHandler(string str);
public class ServerRequest
{
public void DoRequest(string request, CallbackHandler callback)
{
// do stuff....
callback("asdf");
}
}
答案 5 :(得分:2)
您需要的是委托和回调。 Here是一篇很好的MSDN文章,它将向您展示如何在C#中使用此技术。
答案 6 :(得分:1)
您只能使用最适合回调函数的委托:
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)
{
}
}