2009-07-19 12 views
8

के साथ एक एक्शन ऑब्जेक्ट कैसे बनाएं, सबसे पहले, मैं वीएस2005 और सी # 2.0 का उपयोग कर रहा हूं।सी # 2.0 जेनरिक: शून्य पैरामीटर

मैं चयनित इंडेक्स चेंजेड ईवेंट के अंदर से एक कॉम्बोबॉक्स 'टेक्स्ट प्रॉपर्टी सेट करने का प्रयास कर रहा हूं। StackOverflow पर यहाँ एक और thread से निम्नलिखित तरीके से किया प्रस्तावित किया गया था:

BeginInvoke(new Action(() => someCombobox.Text = "x")); 

अब, यह सब से पहले मेरे लिए एक संकलक त्रुटि देता है। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि एक्शन ऑब्जेक्ट दो भाषा विनिर्देशों में अलग-अलग व्यवहार करता है। सी # 2.0 में, एक्शन ऑब्जेक्ट को सभी घोषणाओं में <T> संरचना की आवश्यकता होती है। शायद मैं गलत हूं, लेकिन मैं इसे स्पष्ट करना चाहता हूं।

BeginInvoke(new Action<string>(delegate { someCombobox.Text = "x"; }), new object[] { "" }); 

हालांकि, यह सिर्फ मेरे लिए बहुत अजीब मैं करने के लिए है दिखाई देती है कि एक प्रकार पैरामीटर (खासकर जब से मैं के लिए इच्छुक नहीं कर रहा हूँ के साथ कार्रवाई वस्तु को परिभाषित:

क्या काम करता है निम्नलिखित है किसी भी पैरामीटर पास करें)! किसी भी तरह से इस पैरामीटर को हटाने से खाली नई वस्तु [] अप्रचलित हो जाएगी, जो मैं चाहता हूं।

क्या कोई मुझे उपर्युक्त कॉल को सरल बनाने में मदद कर सकता है?

अंत में, क्या यह गारंटी है कि BeginInvoke चयनित इंडेक्स चेंज के बाद खत्म हो जाएगा और इस प्रकार सही टेक्स्ट के साथ combobox 'टेक्स्ट प्रॉपर्टी को अपडेट करेगा?

मैं वास्तव में इन सवालों के जवाब जानने के लिए सराहना करता हूं।

+0

संकलन त्रुटि लैम्ब्डा अभिव्यक्ति की वजह से है। लैम्ब्डा सी # 3.0 में नए हैं, और प्रतिनिधि निर्माण वाक्यविन्यास का एक छोटा रूप है। –

उत्तर

9

मुझे नहीं लगता कि पैरामीटर के बिना कार्रवाई .NET 2.0 में कोई चिंता नहीं है - बस एक अलग पूर्वनिर्धारित प्रतिनिधि प्रकार का उपयोग करें। MethodInvoker नौकरी करना चाहिए (कोई पैरामीटर के साथ शून्य विधि)।

इसके अलावा, BeginInvoke में 2 ओवरलोड हैं - एक जो एक प्रतिनिधि लेता है, और वह जो प्रतिनिधि और वस्तुओं की सरणी लेता है।

BeginInvoke(new MethodInvoker(delegate() 
{ 
    someCombobox.Text = "x"; 
})); 
+0

मैंने 'System.Action' के सामने आने से पहले कई बार 'MethodInvoker' का उपयोग किया है। :) –

9

आप अपना खुद का कार्य प्रतिनिधि परिभाषित कर सकते हैं।

delegate void Action()

मैं वस्तु आप BeginInvoke कॉल कर रहे हैं, जिस पर नहीं देख सकते हैं, लेकिन अगर यह बता गया के रूप में ही धागे पर बनाया गया एक UI नियंत्रण है, प्रतिनिधि आप पारित कुछ लागू किया जा करने के लिए गारंटी है चयनित इंडेक्स चेंज इवेंट हैंडलर पूरा होने के बाद समय।

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