Дополнительные параметры для FileSystemEventHandler

Я пытаюсь записать программу, которая могла контролировать несколько папок для созданий файла и запустить то же действие, но с различными настройками для каждой папки. Моя проблема находится в определении дополнительного параметра для FileSystemEventHandler. Я создаю новый FileWatcher для каждого каталога, чтобы контролировать и добавить обработчик для Созданного действия:

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 ()?

7
задан peku 14 April 2010 в 09:24
поделиться

4 ответа

foreach (String config in configs)
{
    ...
    FileWatcher.Created += (s,e) => DoSomething(e.FullPath, mSettings);
    ...
}
6
ответ дан 6 December 2019 в 21:11
поделиться

Вы должны понимать, что используете. Определение FileSystemEventHandler -

публичный делегат void FileSystemEventHandler (отправитель объекта, FileSystemEventArgs e);

Вы не можете передать третий аргумент. Для передачи данных 'mSettings', боюсь, вам, возможно, придется написать свой собственный дополнительный код.

0
ответ дан 6 December 2019 в 21:11
поделиться

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); 
} 
6
ответ дан 6 December 2019 в 21:11
поделиться

Вы не можете запросить дополнительную информацию, кроме той, которую предоставляет обработчик 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);
        }
    }
}
0
ответ дан 6 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: