कॉलबैक फ़ंक्शन को दूसरी कक्षा में पास करना


91

मैं मूल रूप से बाद में बुलाए जाने के लिए एक अन्य वर्ग के लिए एक विधि पारित करने की कोशिश कर रहा हूं, लेकिन सी # में यह पता नहीं लगा सकता (मैं अभी भी ऑब्जेक्टिव-सी के लिए उपयोग किया जाता हूं)।

public class Class1{

    private void btn_click(object sender, EventArgs e)
    {
        ServerRequest sr = new ServerRequest();
        sr.DoRequest("myrequest", myCallback);
    }

    public void myCallback(string str)
    {
    }
}

फिर बाद में मैं अपने ServerRestest वर्ग को मूल रूप से कॉलबैक फ़ंक्शन को फायर करना चाहता हूं, क्या यह संभव नहीं है? (मैं मूल रूप से अपने सॉफ़्टवेयर की लॉगिन प्रतिक्रिया के लिए सर्वर पर घर पर फोन कर रहा हूं)

मैं प्रतिनिधियों के साथ ऐसा करने का एक तरीका नहीं खोज पाया, लगातार त्रुटियां हो रही हैं। यहाँ अन्य वर्ग है:

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

क्या यह # में संभव है? ऑब्जेक्टिव-सी में यह सरल होगा और मैं बस कुछ ऐसा करूंगा

[myObject performSelector(@selector(MyFunctionName)) withObjects:nil];

जवाबों:


140

आप इसे पास कर सकते हैं Action<string>- जिसका अर्थ है कि यह एक प्रकार का एकल पैरामीटर है stringजिसमें कुछ भी वापस नहीं आता है (शून्य):

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

और आप DoRequest कैसे कहते हैं? क्या आप एक स्ट्रिंग या एक विधि पारित करते हैं?
— कोकोडको

1
कार्रवाई के बारे में अन्य उत्सुक के लिए। यहाँ एक त्वरित टिप है। इसमें कई प्रकार के पैरा हो सकते हैं, लेकिन कोई रिटर्न नहीं है (c # सदस्यों को पास करने के लिए केवल क्रिया <type1 .., टाइप टाइप>> प्रकार पर संशोधक की अनुमति नहीं है फ़ंक्शन को पास करने के लिए, फ़ंक का उपयोग करें <टाइप करें> फिर से किसी भी प्रकार पर कोई संशोधक अंतिम प्रकार नहीं है सूची फंक्शन रिटर्न प्रकार है वास्तव में एक्शन और
— फ़ंक

मेरा दिन, सरल और साफ बनाओ!
— १

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

4
यह हमेशा एक अच्छा अभ्यास है कि कॉलबैक विधि कॉल करने से पहले यह जांच लें कि क्या यह शून्य नहीं है।
— मकिज

4

Delegateसिर्फ आधार वर्ग है, इसलिए आप इसका उपयोग नहीं कर सकते। आप इस तरह से कुछ कर सकते हैं:

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

2
Func<string>एक विधि होगी जो एक स्ट्रिंग लौटाती है - आपको Action<string>
— ब्रोकनग्लास

@BrokenGlass तुम मेरी खराब हो - अपडेटेड (i जवाब + 1 डी अपना जवाब)
— रोबी

3

आप अपना कोड इस तरह से बदल सकते हैं:

public delegate void CallbackHandler(string str);

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

2

आपको एक प्रतिनिधि और एक कॉलबैक की आवश्यकता है। यहाँ एक अच्छा MSDN लेख है जो आपको दिखाएगा कि C # में इस तकनीक का उपयोग कैसे करें।


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

        }


    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.