2010-07-13 13 views
6

में प्रतिनिधियों को असाइन करने में समस्या मेरे पास एक ऐसा एप्लिकेशन है जो प्लगइन (एमईएफ) में सक्षम है। प्लगइन्स WPF UserControls हैं जो सेवाओं को आयात करते हैं।फॉर-लूप

उपयोगकर्ता एप्लिकेशन के मुख्य मेनू से वांछित प्लगइन का चयन कर सकते हैं।

foreach(IToolPlugin Plugin in ToolPlugins) 
{ 
    Plugin.Init(); 
    MenuItem PluginMenuItem = Plugin.MenuItem; //New MenuItem but with Header set. 
    PluginMenuItem.Click += new RoutedEventHandler(delegate(object o, RoutedEventArgs e) { DoSomething(Plugin.Control);}); 
    PluginsMenu.Items.add(PluginMenuItem); 
} 

यानी किसी एक आइटम के लिए बहुत ठीक काम करता है:

ऐसा करने के लिए, मैं निम्नलिखित पाश का उपयोग करें। लेकिन जैसे ही मेरे पास 1 से अधिक प्लगइन हैं, सभी मेन्यूइटम्स अंतिम लूप के प्रतिनिधि को निष्पादित करते हैं। या कम से कम प्लगइन के साथ। अंतिम पाश का नियंत्रण।

मैं इसे कैसे ठीक कर सकता हूं?
किसी भी मदद के लिए धन्यवाद।

+5

मैं कई देखकर प्यार इस सवाल के बदलाव। – ChaosPandion

+0

@Cos - उस मामले में आपको बंद करने के लिए वोट देना चाहिए;) – ChrisF

उत्तर

8

लूप के प्रत्येक पुनरावृत्ति पर, आपको इसे बंद करने में उपयोग करने से पहले पुनरावृत्त मूल्य के मान को "कैप्चर" करना होगा। अन्यथा प्रत्येक प्रतिनिधि में प्लगइन गुमनाम फ़ंक्शन बनने पर रखे गए मान के बजाय प्लगइन के अंतिम मान को इंगित करेगा।

आप एरिक यहाँ Lippert से गहन विवरण में एक और अधिक पढ़ सकते हैं:

Closing over the loop variable considered harmful - Fabulous Adventures in Coding

संक्षेप में, अपने foreach पाश लिखने के लिए सही तरीका है:

foreach(IToolPlugin Plugin in ToolPlugins) 
{ 
    Plugin.Init(); 
    MenuItem PluginMenuItem = Plugin.MenuItem; 

    IToolPlugin capturedPlugin = Plugin; 

    PluginMenuItem.Click += 
     new RoutedEventHandler(delegate(object o, RoutedEventArgs e) { 
      DoSomething(capturedPlugin.Control); 
     }); 

    PluginsMenu.Items.add(PluginMenuItem); 
} 
+0

मुझे लगता है कि आप इस मामले पर एरिक के ब्लॉग पोस्ट के लिए अनिवार्य लिंक शामिल करने जा रहे हैं? (लूप वैरिएबल पर बंद हानिकारक माना जाता है।) –

+0

@ जोन स्कीट - हाँ ... लिंक प्राप्त करने पर काम कर रहा है। –

+0

हमारे पास इस प्रश्न के लिए एक रोटा होना चाहिए :) (जैसा कि खोजना मुश्किल है, मुझे नहीं लगता कि यह इसे डुप्लिकेट के रूप में बंद करने लायक है।) –