2010-04-14 3 views
6

के लिए अतिरिक्त पैरामीटर मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो फ़ाइल निर्माण के लिए एकाधिक फ़ोल्डरों की निगरानी कर सकता है और एक ही क्रिया को लॉन्च कर सकता है लेकिन प्रत्येक फ़ोल्डर के लिए अलग-अलग सेटिंग्स के साथ। मेरी समस्या FileSystemEventHandler के लिए एक अतिरिक्त पैरामीटर निर्दिष्ट करने में है। मैं पर नजर रखने और निर्मित-कार्रवाई के लिए हैंडलर जोड़ने के लिए प्रत्येक निर्देशिका के लिए एक नया FileWatcher बनाएँ:FileSystemEventHandler

foreach (String config in configs) 
{ 
    ... 
    FileWatcher.Created += new System.IO.FileSystemEventHandler(FileSystemWatcherCreated) 
    ... 
} 

void FileSystemWatcherCreated(object sender, System.IO.FileSystemEventArgs e, MySettings mSettings) 
{ 
    DoSomething(e.FullPath, mSettings); 
} 

मैं 'mSettings' चर FileSystemWatcherCreated के लिए पारित() कैसे मिल सकती है?

+0

कहाँ 'mSettings' सेट होता है? – James

+0

खराब उदाहरण के लिए खेद है। mSettings पहले कॉन्फ़िगरेशन से पहले सेट किया गया है लेकिन मैंने सोचा कि यह वास्तव में प्रश्न के लिए प्रासंगिक नहीं था। – peku

उत्तर

3
foreach (String config in configs) 
{ 
    ... 
    FileWatcher.Created += (s,e) => DoSomething(e.FullPath, mSettings); 
    ... 
} 
+0

आप इस कार्यक्रम से कैसे सदस्यता लेते हैं? क्या होगा अगर पहले ... mSettings.MyProperty = config में फैलता है? – Henrik

+2

हाँ धन्यवाद! ठीक वैसे ही काम करता है जैसा मैं चाहता था। मुझे पता था कि इसे हासिल करने का एक आसान तरीका होना चाहिए था। – peku

+1

+1 पुरानी पोस्ट, लेकिन मुझे यह पता चला और मुझे मदद मिली, – YvesR

0

आप FileWatcher हैंडलर प्रदान करता है उससे अधिक जानकारी के लिए नहीं पूछ सकते हैं। क्या आप फिर भी कर सकते हैं एक छोटे वर्गों है कि विन्यास के लिए उपयोग किया है और यह भी एक प्रतिनिधि है कि आप FileWatcher के Created घटना

class Program 
{ 
    static void Main(string[] args) 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher("yourpath"); 

     var configurations = new IConfiguration[] 
           { 
            new IntConfiguration(20), 
            new StringConfiguration("Something to print") 
           }; 

     foreach(var config in configurations) 
      watcher.Created += config.HandleCreation; 
    } 

    private interface IConfiguration 
    { 
     void HandleCreation(object sender, FileSystemEventArgs e); 
    } 

    private class IntConfiguration : IConfiguration 
    { 
     public IntConfiguration(int aSetting) 
     { 
      ASetting = aSetting; 
     } 

     private int ASetting { get; set; } 

     public void HandleCreation(object sender, FileSystemEventArgs e) 
     { 
      Console.WriteLine("Consume your settings: {0}", ASetting); 
     } 
    } 

    public class StringConfiguration : IConfiguration 
    { 
     public string AnotherSetting { get; set;} 

     public StringConfiguration(string anotherSetting) 
     { 
      AnotherSetting = anotherSetting; 
     } 

     public void HandleCreation(object sender, FileSystemEventArgs e) 
     { 
      Console.WriteLine("Consume your string setting: {0}", AnotherSetting); 
     } 
    } 
} 
+1

यही कारण है कि आपको बंद करने का उपयोग क्यों करना चाहिए, और यह सब अतिरिक्त अनदेखा कोड नहीं लिखना चाहिए। – leppie

0

आप को समझने के लिए आप क्या प्रयोग कर रहे हैं की जरूरत के लिए संलग्न कर सकते हैं है बनाने के लिए है। FileSystemEventHandler की परिभाषा है-

public delegate void FileSystemEventHandler(object sender, FileSystemEventArgs e);

आप तीसरा तर्क पारित नहीं कर सकते हैं। डेटा 'mSettings' को पास करने के लिए, आपको अपना अतिरिक्त कोड लिखना पड़ सकता है, मुझे डर है।

5

foreach (String config in configs) 
{ 
    ... 
    MySettings mSettings = new MySettings(...); // create a new instance, don't modify an existing one 
    var handler = new System.IO.FileSystemEventHandler((s,e) => FileSystemWatcherCreated(s,e,msettings)); 
    FileWatcher.Created += handler; 
    // store handler somewhere, so you can later unsubscribe 
    ... 
} 

void FileSystemWatcherCreated(object sender, System.IO.FileSystemEventArgs e, MySettings mSettings) 
{ 
    DoSomething(e.FullPath, mSettings); 
} 
+0

इसके लिए भी धन्यवाद, मैंने स्वीकार किए गए उत्तर का एक "पूर्ण" संस्करण प्रतीत होता है लेकिन मुझे सदस्यता समाप्त करने की आवश्यकता नहीं होगी। लगता है कि मैं सबसे सरल दृष्टिकोण के साथ रहना होगा। +1 – peku

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