Básicamente, estoy tratando de pasar un método a otra clase para que se llame más tarde, pero no puedo resolver esto en C # (todavía estoy demasiado acostumbrado a 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)
{
}
}
Luego, más adelante, quiero que mi clase ServerRequest básicamente active la función de devolución de llamada, ¿no es esto posible? (Básicamente estoy llamando a casa a un servidor para obtener una respuesta de inicio de sesión a mi software)
No he podido encontrar una manera de hacer esto con los delegados, recibo errores continuamente. Aquí está la otra clase:
public class ServerRequest
{
public void DoRequest(string request, Delegate callback)
{
// do stuff....
callback("asdf");
}
}
¿Es esto posible en #? En Objective-C esto sería simple y solo haría algo como
[myObject performSelector(@selector(MyFunctionName)) withObjects:nil];
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"); } }
fuente
Primero debe declarar el tipo de delegado porque los delegados están fuertemente tipados:
public void MyCallbackDelegate( string str ); public void DoRequest(string request, MyCallbackDelegate callback) { // do stuff.... callback("asdf"); }
fuente
Delegate
es solo la clase base, por lo que no puede usarla así. Sin embargo, podrías hacer algo como esto:public void DoRequest(string request, Action<string> callback) { // do stuff.... callback("asdf"); }
fuente
Func<string>
sería un método que devuelve una cadena; necesita unAction<string>
Puede cambiar su código de esta manera:
public delegate void CallbackHandler(string str); public class ServerRequest { public void DoRequest(string request, CallbackHandler callback) { // do stuff.... callback("asdf"); } }
fuente
Lo que necesita es un delegado y una devolución de llamada. Aquí hay un buen artículo de MSDN que le mostrará cómo usar esta técnica en C #.
fuente
Puede usar solo el delegado que sea mejor para las funciones de devolución de llamada:
public class ServerRequest { public delegate void CallBackFunction(string input); public void DoRequest(string request, CallBackFunction callback) { // do stuff.... callback(request); } }
y consumir esto como a continuación:
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) { } }
fuente