c# -如何对另一个类中引发的事件做出反应

本文关键字:事件 另一个 | 更新日期: 2023-09-27 18:17:11

我有两个班:

一个服务,它创建一个FileSystemWatcher,当被监视的文件被Word保存时触发一个事件。还有一个UserControl,它有一些函数,我需要在SaveEvent被触发时执行。

如何对UserControl中的SaveEvent做出反应?

c# -如何对另一个类中引发的事件做出反应

我将在服务中创建一个事件,该事件将在FileSystemWatcher被引发时引发。服务应该包装FileSystemWatcher。两个对象的父对象都将调用UserControl上的一个方法。

例如:(PSEUDO)
class MyProgram
{
    Service svc;
    UserControl ctrl;
    public MyProgram()
    {
        // create the control
        ctrl = new UserControl();
        // create the service
        svc = new Service();
        svc.SaveEvent += FileChanges;
        /////// you might construct something like:   _(do not use both)_
        svc.SaveEvent += (s, e) => ctrl.FileIsSaved(e.Filename);
    }
    private void FileChanges(object sender, ServiceFileChangedEventArgs e)
    {
        ctrl.FileIsSaved(e.Filename);
    }
}

class Service
{
    // FileSystemWatcher
    private FileSystemWatcher _watcher;
    public Service() // constructor
    {
        // construct it.
        _watcher = new FileSystemWatcher();
        _watcher.Changed += Watcher_Changed;
    }
    // when the file system watcher raises an event, you could pass it thru or construct a new one, whatever you need to pass to the parent object
    private void Watcher_Changed(object source, FileSystemEventArgs e)
    {
        SaveEvent?.Invoke(this, new ServiceFileChangedEventArgs(e.FullPath)); // whatever
    }
    public event EventHandler<SaveEventEventArgs> SaveEvent;
}
class SaveEventEventArgs : EventArgs
{
    // filename etc....
}

这只是一些伪示例代码。但重要的是,您的Program/Usercontrol应该而不是依赖于FileSystemWatcher。你的Service应该把它包起来。因此,无论何时您决定将FileSystemWatcher更改为(例如)DropBoxWatcher,程序的其余部分都不会中断。

为该事件创建一个委托来处理它

myClass.SaveEvent += DelegateMethod();
public void DelegateMethod(object sender, SaveEventArgs e)
{
    //do stuff
    //run your handler code
}