2010-04-14 12 views
6

Estoy intentando escribir un programa que podría controlar varias carpetas para crear archivos y ejecutar la misma acción pero con diferentes configuraciones para cada carpeta. Mi problema está en especificar un parámetro adicional para FileSystemEventHandler. Creo un nuevo FileWatcher para cada directorio para supervisar y agregar el controlador para la acción Creado:Parámetros adicionales para 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); 
} 

¿Cómo podría obtener la variable '' mSettings pasado a FileSystemWatcherCreated()?

+0

dónde viene 'mSettings' consiguen el sistema? – James

+0

Perdón por el mal ejemplo. mSettings se establece en la primera ... de la configuración actual, pero pensé que no era realmente relevante para la pregunta. – peku

Respuesta

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

¿Cómo se da de baja del evento? ¿Qué pasa si el primero ... se expande a mSettings.MyProperty = config? – Henrik

+2

¡Sí, gracias! Funciona exactamente como yo quería. Sabía que tenía que haber una forma simple de lograr esto. – peku

+1

+1 Publicación anterior, pero la encontré en google'ing y me ayudó, también – YvesR

0

No puede solicitar más información que la que proporciona el controlador FileWatcher. Lo que se puede hacer sin embargo es crear un pequeño clases que tienen acceso a la configuración y también tienen un delegado que puede adjuntar a Created caso de que el FileWatcher 's

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

Este es exactamente el motivo por el que debe usar cierres, y no escribir todo este código extra innecesario. – leppie

0

Es necesario comprender lo que está utilizando. FileSystemEventHandler 's definición es-

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

No se puede pasar el tercer argumento. Para pasar los datos 'mSettings', puede que tenga que escribir su propio código extra, me temo.

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

Gracias por esto también, parece ser una versión más "completa" de la respuesta que acepté, pero ya que no necesitaré cancelar la suscripción I creo que me quedaré con el enfoque más simple. +1 – peku

Cuestiones relacionadas