FileSystemEventHandler 的附加参数
Posted
技术标签:
【中文标题】FileSystemEventHandler 的附加参数【英文标题】:Additional parameters for FileSystemEventHandler 【发布时间】:2011-02-07 20:05:55 【问题描述】:我正在尝试编写一个程序,该程序可以监视多个文件夹的文件创建并启动相同的操作,但每个文件夹的设置不同。我的问题是为 FileSystemEventHandler 指定一个额外的参数。我为每个目录创建一个新的 FileWatcher 来监视和添加 Created-action 的处理程序:
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()?
【问题讨论】:
mSettings
在哪里设置?
抱歉这个不好的例子。 mSettings 是在当前配置的第一个...中设置的,但我认为它与问题并不真正相关。
【参考方案1】:
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);
【讨论】:
也谢谢你,这似乎是我接受的答案的更“完整”版本,但由于我不需要退订,我想我会坚持使用最简单的方法。 +1 竖起大拇指,它对我也有帮助,尤其是评论“// 创建一个新实例,不要修改现有实例”。你能解释一下为什么我们需要为它创建一个新实例并且在创建处理程序后不能修改它吗? @adrianko 该实例由处理事件的 lambda 捕获。如果有多个处理程序需要不同的实例,则必须显式创建这些处理程序。否则,处理程序已使用的实例将被修改。【参考方案2】:foreach (String config in configs)
...
FileWatcher.Created += (s,e) => DoSomething(e.FullPath, mSettings);
...
【讨论】:
如何退订活动?如果第一个 ... 扩展到 mSettings.MyProperty = config 怎么办? 好的,谢谢!完全按照我的意愿工作。我知道必须有一种简单的方法来实现这一点。【参考方案3】:您不能要求比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);
【讨论】:
这正是你应该使用闭包而不是编写所有这些额外不需要的代码的原因。【参考方案4】:您需要了解您在使用什么。 FileSystemEventHandler
的定义是-
public delegate void FileSystemEventHandler(object sender, FileSystemEventArgs e);
你不能传递第三个参数。 为了传递数据“mSettings”,恐怕您可能需要编写自己的额外代码。
【讨论】:
以上是关于FileSystemEventHandler 的附加参数的主要内容,如果未能解决你的问题,请参考以下文章