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);

FileSystemEventHandler方法作为参数

好吧,听起来你只是想处理程序本身作为参数:

public void WatchConfigFile(FileSystemEventHandler handler)
{
    ...
    this.watcher.Changed += handler;
    ...
}

应该没问题。当调用WatchConfigFile时,会有一个从ConfigFileChangedFileSystemEventHandler的方法组转换。

(请记住,目前您的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");
}