我有以下方法设置FileSystemEventHandler来监视config.xml文件的更改。
public void WatchConfigFile(???)
{
this.watcher = new FileSystemWatcher();
DirectoryInfo _di = Directory.GetParent(configFile);
this.watcher.Path = _di.FullName;
this.watcher.Filter = Path.GetFileName(configFile);
this.watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.CreationTime;
this.watcher.Changed += new FileSystemEventHandler(???);
this.watcher.EnableRaisingEvents = true;
log.Info("Config watcher established at " + watcher.Path);
}
我想将此方法添加到我们反复使用的标准方法库中,但不知道如何将onChanged方法处理程序传递给方法并将其分配给观察程序。由???代表的方法(处理变更)将是这样的:
public void ConfigFileChanged(object source, FileSystemEventArgs e)
{
// Do something when file is updated
}
我希望能够如下调用:
_library.WatchConfigFile(ConfgiFileChanged);
答案 0 :(得分:2)
听起来你只想将处理程序本身作为参数:
public void WatchConfigFile(FileSystemEventHandler handler)
{
...
this.watcher.Changed += handler;
...
}
那应该没问题。当您致电ConfigFileChanged
时,会有FileSystemEventHandler
到WatchConfigFile
的方法组转化。
(请记住,目前您的WatchConfigFile
方法替换 this.watcher
的当前内容...所以,如果您再次调用它,则不会有参考再到第一个观察者了。也许你想要一个List<FileSystemWatcher>
而不是?)
答案 1 :(得分:0)
一种可能性是使用delegates。
代表:
public delegate void ConfigFileChangedHandler(object source, FileSystemEventArgs e);
使用委托的类可以如下所示:
public class Dummy
{
public ConfigFileChangedHandler FileChangedHandler { get; set; }
public void UseTheAction(ConfigFileChangedHandler action)
{
// invoke
action(this, null);
// or bind
// object.Event += action;
}
}
用法:
var dummy = new Dummy();
dummy.FileChangedHandler += ConfigFileChanged;
dummy.UseTheAction(ConfigFileChanged);
private void ConfigFileChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("Event fired");
}