콜백 함수를 다른 클래스에 전달


91

기본적으로 나중에 호출 할 다른 클래스에 메서드를 전달하려고하지만 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];

답변:


140

다음과 같이 전달할 수 있습니다. Action<string>즉, string아무것도 반환하지 않는 유형의 단일 매개 변수가있는 메서드 (void)입니다.

public void DoRequest(string request, Action<string> callback)
{
    // do stuff....
    callback("asdf");
}

DoRequest를 어떻게 호출합니까? 문자열이나 메서드를 전달합니까?
Kokodoko 2015 년

1
액션에 대한 다른 궁금증을 위해. 여기에 간단한 팁이 있습니다. 여러 유형 매개 변수를 가질 수 있지만 반환은 없습니다 (C # 멤버 만 전달하는 경우 Action <type1, .., typeN>은 유형에 대한 수정자를 허용하지 않음 함수를 전달하려면 Func <typeList>를 다시 사용하십시오. list는 실제로 함수 반환 유형입니다. Action과 Func는 간단한 대리자를 사용하는 빠른 방법입니다.
gg89

내 하루를 간단하고 깨끗하게 만드십시오!
isanjosgon

24
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");
        }
    }

10

대리자는 강력한 형식이므로 먼저 대리자의 형식을 선언해야합니다.

public void MyCallbackDelegate( string str );

public void DoRequest(string request, MyCallbackDelegate callback)
{
     // do stuff....
     callback("asdf");
}

이는 코드의 여러 위치에서 동일한 메서드 서명을 사용하는 경우 훌륭한 솔루션입니다.
mtmurdock 2012 년

4
콜백 메서드를 호출하기 전에 항상 null이 아닌지 확인하는 것이 좋습니다.
Maciej

4

Delegate기본 클래스이므로 그렇게 사용할 수 없습니다. 그래도 다음과 같이 할 수 있습니다.

public void DoRequest(string request, Action<string> callback)
{
     // do stuff....
     callback("asdf");
}

2
Func<string>문자열 을 반환 하는 메서드가 될 것입니다 -당신은Action<string>
BrokenGlass

@BrokenGlass 당신은 바로 내 나쁜이야 - 업데이트 (I했습니다 + 1D 답)
로비

3

다음과 같이 코드를 변경할 수 있습니다.

public delegate void CallbackHandler(string str);

public class ServerRequest
{
    public void DoRequest(string request, CallbackHandler callback)
    {
        // do stuff....
        callback("asdf");
    }
}

2

필요한 것은 델리게이트와 콜백입니다. 다음 은 C #에서이 기술을 사용하는 방법을 보여주는 멋진 MSDN 기사입니다.


2

콜백 함수에 가장 적합한 델리게이트 만 사용할 수 있습니다.

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

        }


    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.