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

그런 다음 나중에 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)
        {

        }


    }