2012-05-12 13 views
6

मैंने किसी चीज़ System.ComponentModel.ISynchronizeInvoke का उपयोग करता है, जो विधि है का निर्माण करने की कोशिश कर रहा हूँ: (अन्य लोगों के)सी # में लागू System.Delegate वर्ग वस्तु

public object Invoke(Delegate method, object[] args) 

सबसे अच्छा तरीका है फोन करने के लिए क्या है दिए गए तर्कों के साथ विधि? मैं उपयोग कर सकता हूं:

public object Invoke(Delegate method, object[] args) 
    { 
     return method.DynamicInvoke(args); 
    } 

लेकिन यह देर से बाध्य है। मेरा आंत वृत्ति यह है कि विधि को कॉल करने का यह एकमात्र तरीका है .. कोई विचार?

+3

सावधान रहें कि जब आप इंटरफ़ेस को कार्यान्वित करते हैं तो आप बहुत कठोर वादे कर रहे हैं। आपको वास्तव में * कोड * सिंक्रनाइज़ करने की उम्मीद है। पहले InvokeRequired संपत्ति को लागू करने पर फ़ोकस करें, यह कठिन है। –

उत्तर

4

मुझे लगता है कि यह किसी भी अन्य तरीके से तर्कसंगत रूप से असंभव है। method प्रतिनिधि किसी भी हस्ताक्षर की विधि को समाहित कर सकता है (किसी भी संख्या और पैरामीटर के प्रकार, और किसी भी प्रकार का रिटर्न वैल्यू या शून्य)। इसके हस्ताक्षर को हल करने का एकमात्र तरीका और आपूर्ति किए गए तर्कों के साथ इसे आमंत्रित करें (यह सत्यापित करने के बाद कि वे सही मात्रा और प्रकार के हैं) प्रतिबिंब के माध्यम से रन-टाइम पर होंगे।

यदि आप ISynchronizeInvoke इंटरफ़ेस को कार्यान्वित नहीं कर रहे थे और अपनी विधि को परिभाषित कर सकते थे, तो आप अपने method तर्क को केवल एक विशेष हस्ताक्षर के विधि प्रतिनिधियों को स्वीकार करने के लिए प्रतिबंधित कर सकते हैं; उस स्थिति में, आप उन्हें सीधे बुला सकते हैं।

उदाहरण के लिए, तरीकों कि कोई पैरामीटर नहीं है और एक वापसी मान है निष्पादित करने के लिए, आप का प्रयोग करेंगे:

public TResult Invoke<TResult>(Func<TResult> method) 
{ 
    return method(); 
} 

एक विधि है कि तीन पैरामीटर लेता है और कोई वापसी महत्व है पर अमल करने के लिए आप का प्रयोग करेंगे:

public void Invoke<T1,T2,T3>(Action<T1,T2,T3> method, T1 arg1, T2 arg2, T3 arg3) 
{ 
    method(arg1, arg2, arg3); 
} 
+0

थोड़ा और खोदने के बाद, हाँ, यह निष्कर्ष है कि मैं भी साथ आया हूं। संक्षिप्त प्रतिक्रिया के लिए धन्यवाद। – Rob

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