微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FileSystemWatcher事件是System.Delegate无法触摸的吗?

如何解决FileSystemWatcher事件是System.Delegate无法触摸的吗?

| 我正在编写涉及FileSystemWatcher对象的集成测试。为了使事情变得容易,我想取消订阅事件委托中的所有内容,而不必查找每个订阅。我已经看到相关的帖子,是否需要取消订阅活动?。这多少有些重复,但是我专门问为什么这不适用于FileSystemWatcher对象。 最好执行以下操作:
private void MethodName()
{
    var watcher = new FileSystemWatcher(@\"C:\\Temp\");
    watcher.Changed += new FileSystemEventHandler(watcher_Changed);

    watcher.Changed = null; // A simple solution that smells of C++.

    // A very C#-ish solution:
    foreach (FileSystemEventHandler eventDelegate in 
             watcher.Changed.GetInvocationList())
        watcher.Changed -= eventDelegate;
}
无论如何引用Changed事件,编译器都会报告: 事件\'System.IO.FileSystemWatcher.Changed \'只能出现在+ =或-=的左侧 当使用同一类中的事件时,上面的代码可以正常工作:
public event FileSystemEventHandler MyFileSystemEvent;

private void MethodName()
{
    MyFileSystemEvent += new FileSystemEventHandler(watcher_Changed);

    MyFileSystemEvent = null; // This works.

    // This works,too.
    foreach (FileSystemEventHandler eventDelegate in 
             MyFileSystemEvent.GetInvocationList())
        watcher.Changed -= eventDelegate;
}
那么,我想念什么?看来我应该能够对FileSystemWatcher事件执行相同的操作。     

解决方法

当您在类中声明事件时,它等效于(几乎)以下代码:
private FileSystemEventHandler _eventBackingField;
public event FileSystemEventHandler MyFileSystemEvent
{
    add
    {
        _eventBackingField =
            (FileSystemEventHandler)Delegate.Combine(_eventBackingField,value);
    }
    remove
    {
        _eventBackingField =
            (FileSystemEventHandler)Delegate.Remove(_eventBackingField,value);
    }
}
请注意,事件没有“ 3”或“ 4”访问器(例如属性),并且您不能显式地编写它们。 当您在类中编写
MyFileSystemEvent = null
时,实际上是在做
_eventBackingField = null
,但是在您的课堂之外,无法直接设置此变量,您只有事件
add
remove
访问器。 这可能是一个令人困惑的行为,因为您可以在类内部按事件名称引用事件处理程序委托,而不能在类外部进行。     ,简短的回答是:
+=
-=
是公共运营商,而
=
是声明事件的类的私有运营商。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。