दिलचस्प पोस्ट
लम्बेडा / लिनक ऑब्जेक्ट्स के जरिए एक सूची छंटनी एक सरणी की चाबियाँ मुद्रित करें निर्भरता इंजेक्शन कंटेनर के लाभ क्या हैं? कक्षा में जावास्क्रिप्ट में तत्व कैसे प्राप्त करें? स्ट्रिंग के पहले एन वर्ण प्राप्त करें CakePHP में एक मॉडल के लिए गतिशील रूप से एकाधिक डेटाबेस का उपयोग कैसे करें खोज आदेश के साथ regex का उपयोग कैसे करें? "प्रतीक्षा_फ़ेंस: उत्तर प्राप्त करने में विफल: 10004003"? Jquery sortable का उपयोग करते समय मैं आइटम की नकल कैसे करूं? JQGrid कस्टम छंटनी jq प्लॉट दिनांकएक्सिस टिक अंतराल काम नहीं कर रहा है अजगर इंडेंटेशन को ठीक कैसे करें जावास्क्रिप्ट में माइक्रोसेकेंड का समय इंटरफ़ेस बिल्डर: UIView के लेआउट iOS 6/7 Deltas क्या हैं? स्क्रीन अभिविन्यास परिवर्तनों पर राज्य को खोने से कस्टम दृश्यों को कैसे रोकें

सी # एक घटना हैंडलर के लिए अतिरिक्त पैरामीटर पास?

कहें, मैं एक ईवेंट हैंडलर निर्दिष्ट करते समय कुछ अतिरिक्त डेटा पास करना चाहता हूं। निम्नलिखित कोड पर विचार करें:

private void setup(string someData) { Object.assignHandler(evHandler); } public void evHandler(Object sender) { // need someData here!!! } 

मैं कैसे अपने evHandler विधि में कुछ डेटा प्राप्त करने के बारे में जाना होगा?

Solutions Collecting From Web of "सी # एक घटना हैंडलर के लिए अतिरिक्त पैरामीटर पास?"

 private void setup(string someData) { Object.assignHandler((sender) => evHandler(sender,someData)); } public void evHandler(Object sender, string someData) { // need someData here!!! } 

कब्जा किए गए चर:

 private void setup(string someData) { Object.assignHandler((sender,args) => { evHandler(sender, someData); }); } public void evHandler(Object sender, string someData) { // use someData here } 

या (सी # 2.0 वैकल्पिक):

  Object.assignHandler((EventHandler)delegate(object sender,EventArgs args) { evHandler(sender, someData); }); 

मेरे पास @ Object.assignHandler((sender) => evHandler(sender,someData)); के उदाहरण विशेष रूप से: Object.assignHandler((sender) => evHandler(sender,someData)); साथ एक कठिन समय था। Object.assignHandler((sender) => evHandler(sender,someData)); क्योंकि वस्तु के रूप में ऐसा कोई चीज नहीं है। तो मैंने थोड़ा और Googling किया और इस उदाहरण को मिला। पीटर ड्यूनिहो का जवाब मेरे सिर पर क्लिक किया गया था (यह मेरा काम नहीं है):

धज्जी

सामान्य दृष्टिकोण का उपयोग एक अनाम पद्धति का उपयोग करना है जिसमें ईवेंट हैंडलर है जिसमें आपके संशोधित हस्ताक्षर हैं। उदाहरण के लिए:

 void Onbutton_click(object sender, EventArgs e, int i) { ... } button.Click += delegate(object sender, EventArgs e) { Onbutton_click(sender, e, 172); }; 

बेशक, आपको 172 में पास नहीं करना होगा, या फिर तीसरे पैरामीटर को कोई int भी नहीं करना चाहिए। 🙂

/ कटाव

उस उदाहरण का उपयोग करके मैं दो कस्टम ComboBoxItem Timer.Elapsed ऑब्जेक्ट्स को एक Timer.Elapsed में पारित कर पा रहा था। लैम्ब्डा नोटेशन का प्रयोग करके Timer.Elapsed इवेंट:

 simulatorTimer.Elapsed += (sender, e) => onTimedEvent(sender, e, (ComboBoxItem) cbPressureSetting.SelectedItem, (ComboBoxItem) cbTemperatureSetting.SelectedItem); 

और उसके बाद उसके हैंडलर में:

 static void onTimedEvent(object sender, EventArgs e, ComboBoxItem pressure, ComboBoxItem temperature) { Console.WriteLine("Requested pressure: {0} PSIA\nRequested temperature: {1}° C", pressure, temperature); } 

यह ऊपर दिए गए उदाहरणों से कोई नया कोड नहीं है, लेकिन यह प्रदर्शित करता है कि उन्हें कैसे व्याख्या करना है। उम्मीद है कि मेरे जैसे किसी को यह शिक्षाप्रद और उपयोगी लगता है, इसलिए वे इस तरह की अवधारणा को समझने के लिए घंटों में खर्च नहीं करते जैसे मैंने किया था।

यह कोड मेरी प्रोजेक्ट में काम करता है ( ComboBoxItem ऑब्जेक्ट्स के साथ गैर-धागा-सुरक्षित अपवाद को छोड़कर, मुझे विश्वास नहीं है कि उदाहरण कैसे काम करता है) मुझे लगता है कि अब बाहर लग रहा है

आप ऐसा करने का प्रयास कर सकते हैं:

 string yourObject; theClassWithTheEvent.myEvent += (sender, model) => { yourObject = "somthing"; } 

खैर, सरलतम आईडी आईडी कुछ someData को सदस्य वैरिएबल बनाने की तरह है:

 public class MyClass { private string _eventData; private void setup(string someData) { _eventData = someData; Object.assignHandler(evHandler); } public void evHandler() { // do something with _eventData here } } 

मुझे यकीन नहीं है कि यह करने का सबसे अच्छा तरीका है, लेकिन यह वास्तव में ईवेंट प्रकार, वस्तु, आदि पर निर्भर करता है।

आप ऑब्जेक्ट के आधार पर अतिरिक्त गुण वाले कस्टम ऑब्जेक्ट बना सकते हैं:

 class CustomObject : Object { public string SomeData; } private void setup(string someData) { CustomObject customObject = new CustomObject { SomeData = someData }; CustomObject.assignHandler(evHandler); } public void evHandler(Object sender) { string someData = ((CustomObject)sender).SomeData; } 

यदि डेटा को आरंभीकरण के बाद अब और नहीं बदला जाना चाहिए, उदाहरण के लिए, आप एक कस्टम निर्माता भी जोड़ सकते हैं।

यहां मेरा एक-लाइन समाधान है जो टाइमर हैंडलर को अतिरिक्त पैरामीटर पास करता है।

 private void OnFailed(uint errorCode, string message) { ThreadPoolTimer.CreateTimer((timer) => { UI.ErrorMessage = string.Format("Error: 0x{0:X} {1}", errorCode, message); }, System.TimeSpan.FromMilliseconds(100)); } 

मेरा प्रश्न जो समान था, उसे डुप्लिकेट के रूप में चिह्नित किया गया था, इसलिए मैंने यहां एक उत्तर जोड़ लिया था क्योंकि यह मेरे प्रश्न पर मुझे नहीं दूँगा।

 class Program { delegate void ComponentEventHandler(params dynamic[] args); event ComponentEventHandler onTest; static void Main(string[] args) { Program prg = new Program(); // can be bound to event and called that way prg.onTest += prg.Test; prg.onTest.Invoke("What", 5, 12.0); Console.ReadKey(); } public void Test(params dynamic[] values) { // assign our params to variables string name = values[0]; int age = values[1]; double value = values[2]; Console.WriteLine(name); Console.WriteLine(age); Console.WriteLine(value); } }