我可以为一个方法组合两个或多个不同的事件吗

本文关键字:事件 组合 一个 方法 我可以 两个 | 更新日期: 2023-09-27 18:30:08

我使用的是FileSystemWatcher

将具有相同类型的事件组合在一起很容易,在这里(FileSystemEventArgs),我看到了将额外的参数传递给事件处理程序,但将事件传递给事件方法,我不知道怎么做。

之前,我想做这样的事情:

private void SystemWatch(object sender, 
                         System.IO.RenamedEventArgs e, 
                         System.IO.FileSystemEventArgs f)

但是我们不能更改FileSystemEventHandlerRenamedEventHandler委托,那么有其他方法吗?

我可以为一个方法组合两个或多个不同的事件吗

委托与事件中的委托一样,定义期望调用的方法签名。因此,具有不同签名的事件不能隐式调用具有不同签名(signature)的方法。

一个潜在的解决方法可能是使用动态lambda方法来执行翻译:

watcher.Created += (s, a) => SystemWatch(s, null, a);
watcher.Renamed += (s, a) => SystemWatch(s, a, null); 

编辑:

经过进一步的考虑,正如McGarnagle所说,RenamedEventsArgs继承自FileSystemEventArgs。您应该能够使用单个事件处理程序来处理这两种情况:

private static void OnCreatedOrRenamed(object source, FileSystemEventArgs e)

您可以通过检查e:的类型来判断是哪种操作

if (e is RenamedEventArgs)
    ...
else
    ...

您可以随时检查文件是否使用基本的Changed事件处理程序创建或重命名

watcher.Changed += Watcher_Changed;

它具有FileSystemEventArgs类型的自变量,提供更改类型的信息:

void Watcher_Changed(object sender, FileSystemEventArgs e)
{
    switch (e.ChangeType)
    {
        case WatcherChangeTypes.Created:            
            break; // file was created
        case WatcherChangeTypes.Renamed:
            break; // file was renamed
    }
}