Я пытаюсь записать программу, которая могла контролировать несколько папок для созданий файла и запустить то же действие, но с различными настройками для каждой папки. Моя проблема находится в определении дополнительного параметра для 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 ()?
foreach (String config in configs)
{
...
FileWatcher.Created += (s,e) => DoSomething(e.FullPath, mSettings);
...
}
Вы должны понимать, что используете. Определение FileSystemEventHandler
-
публичный делегат void FileSystemEventHandler (отправитель объекта, FileSystemEventArgs e);
Вы не можете передать третий аргумент. Для передачи данных 'mSettings', боюсь, вам, возможно, придется написать свой собственный дополнительный код.
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);
}
Вы не можете запросить дополнительную информацию, кроме той, которую предоставляет обработчик 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);
}
}
}