如何解决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 举报,一经查实,本站将立刻删除。