FileSystemEventHandler方法作为参数
本文关键字:参数 方法 FileSystemEventHandler | 更新日期: 2023-09-27 18:03:37
我有以下方法,该方法设置了一个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);
好吧,听起来你只是想处理程序本身作为参数:
public void WatchConfigFile(FileSystemEventHandler handler)
{
...
this.watcher.Changed += handler;
...
}
应该没问题。当调用WatchConfigFile
时,会有一个从ConfigFileChanged
到FileSystemEventHandler
的方法组转换。
(请记住,目前您的WatchConfigFile
方法取代了 this.watcher
的当前内容…所以如果你调用它两次,你就不再有对第一个观察者的引用。也许你想要一个List<FileSystemWatcher>
代替?)
一种可能是使用委托。
- 创建定义委托
- 在你的类中定义一个自定义委托类型的方法
- 将处理程序方法分配给类的字段或将其用作参数
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");
}