2012-03-29 13 views
57

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

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

क्या यह # में संभव है? ऑब्जेक्टिव-सी में यह आसान होगा और मैं बस की तरह

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

उत्तर

99

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

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

इतना आसान धन्यवाद! मुझे एक्शन के बारे में कोई जानकारी नहीं थी! – Geesu

+0

और आप DoRequest को कैसे कॉल करते हैं? क्या आप एक स्ट्रिंग या विधि पास करते हैं? कार्रवाई के बारे में अन्य उत्सुकता के लिए – Kokodoko

+0

। यहाँ एक त्वरित टिप है। यह कई प्रकार parms लेकिन कोई वापसी (ग # सदस्यों पारित करने के लिए हो सकता है केवल कार्रवाई प्रकार पर संशोधक समारोह पास करने के लिए अनुमति नहीं है, समारोह फिर कोई संशोधक का उपयोग किसी भी प्रकार पर सूची में अंतिम प्रकार फ़ंक्शन रिटर्न प्रकार असल में एक्शन और फनक सरल प्रतिनिधियों का उपयोग करने का त्वरित तरीका है – gg89

9

क्योंकि प्रतिनिधियों दृढ़ता से लिखे जाते हैं आप पहले प्रतिनिधि के प्रकार की घोषणा करने के लिए है:

public void MyCallbackDelegate(string str); 

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

यह एक अच्छा समाधान है यदि आप कई स्थानों पर एक ही विधि हस्ताक्षर का उपयोग कर रहे हैं आपके कोड में – mtmurdock

+3

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

3

Delegate बस है बेस क्लास ताकि आप इसका इस्तेमाल नहीं कर सकें। आप इस हालांकि की तरह कुछ कर सकता है:

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

'Func 'एक विधि होगी जो * एक रिटर्न * आईएनजी - आपको एक 'एक्शन ' – BrokenGlass

+0

@ ब्रोकन ग्लास की ज़रूरत है, आप सही हैं - अपडेट किया गया है (मैंने आपका जवाब +1 किया है) – Robbie

3

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

public delegate void CallbackHandler(string str); 

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

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

17
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"); 
     } 
    } 
+1

इस विस्तृत नमूने के लिए धन्यवाद – gdbj

संबंधित मुद्दे