기본적으로 나중에 호출 할 다른 클래스에 메서드를 전달하려고하지만 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];
답변
다음과 같이 전달할 수 있습니다. Action<string>
즉, string
아무것도 반환하지 않는 유형의 단일 매개 변수가있는 메서드 (void)입니다.
public void DoRequest(string request, Action<string> callback)
{
// do stuff....
callback("asdf");
}
답변
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");
}
}
답변
대리자는 강력한 형식이므로 먼저 대리자의 형식을 선언해야합니다.
public void MyCallbackDelegate( string str );
public void DoRequest(string request, MyCallbackDelegate callback)
{
// do stuff....
callback("asdf");
}
답변
Delegate
기본 클래스이므로 그렇게 사용할 수 없습니다. 그래도 다음과 같이 할 수 있습니다.
public void DoRequest(string request, Action<string> callback)
{
// do stuff....
callback("asdf");
}
답변
다음과 같이 코드를 변경할 수 있습니다.
public delegate void CallbackHandler(string str);
public class ServerRequest
{
public void DoRequest(string request, CallbackHandler callback)
{
// do stuff....
callback("asdf");
}
}
답변
필요한 것은 델리게이트와 콜백입니다. 다음 은 C #에서이 기술을 사용하는 방법을 보여주는 멋진 MSDN 기사입니다.
답변
콜백 함수에 가장 적합한 델리게이트 만 사용할 수 있습니다.
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)
{
}
}