FileSystemEventHandler方法作为参数

时间:2014-05-15 13:51:38

标签: c# filesystemwatcher

我有以下方法设置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);

2 个答案:

答案 0 :(得分:2)

听起来你只想将处理程序本身作为参数:

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

那应该没问题。当您致电ConfigFileChanged时,会有FileSystemEventHandlerWatchConfigFile的方法组转化。

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