2010-04-14 4 views
6

Ich versuche, ein Programm zu schreiben, das mehrere Ordner für Dateierstellung überwachen und die gleiche Aktion aber mit anderen Einstellungen für jeden Ordner starten konnte. Mein Problem besteht darin, einen zusätzlichen Parameter für den FileSystemEventHandler anzugeben. Ich erstelle ein neues Filewatcher für jedes Verzeichnis der Handler für die Erstellt-Aktion zu überwachen und fügen:Zusätzliche Parameter für 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); 
} 

Wie kann ich den ‚mSettings‘ Variable FileSystemWatcherCreated() übergeben werden?

+0

Wo 'mSettings' gesetzt werden? – James

+0

Sorry für das schlechte Beispiel. mSettings ist in der ersten ... von der aktuellen Konfiguration gesetzt, aber ich dachte, es war nicht wirklich relevant für die Frage. – peku

Antwort

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

Wie können Sie sich von der Veranstaltung abmelden? Was passiert, wenn der erste ... auf mSettings.MyProperty = config erweitert wird? – Henrik

+2

Ja danke! Funktioniert genau wie ich wollte. Ich wusste, dass es einen einfachen Weg geben musste, dies zu erreichen. – peku

+1

+1 Alte Post, aber fand es google'ing es und half mir auch – YvesR

0

Sie können nicht mehr Informationen anfordern, als der FileWatcher Handler bereitstellt. Was man jedoch tun, ist eine kleine Klassen zu erstellen, die den Zugriff auf die Konfiguration und haben auch einen Delegierten, die Sie die FileWatcher ‚s Created Ereignis

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

Dies ist genau der Grund, warum Sie Closures verwenden sollten und nicht all diesen zusätzlichen Code schreiben sollten. – leppie

0

Sie müssen anhängen verstehen, was Sie verwenden. FileSystemEventHandler ‚s Definition is-

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

Sie nicht das dritte Argument passieren kann. Um die Daten 'mSettings' zu übergeben, müssen Sie möglicherweise Ihren eigenen zusätzlichen Code schreiben, fürchte ich.

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

Vielen Dank dafür scheint auch eine "vollständige" Version der Antwort, die ich akzeptiert, aber da ich nicht abbestellen werde ich Ich denke, ich bleibe bei der einfachsten Herangehensweise. +1 – peku