Передача функции обратного вызова другому классу
Я в основном пытаюсь передать метод другому классу, который будет вызываться позже, но не могу понять это на С# (я все еще слишком привык к 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];
Ответы
Ответ 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, которая покажет вам, как использовать эту технику на С#.