实现事件时,可以为add
和remove
事件处理程序提供代码。但是,可以通过三种方式访问事件:
MyEvent += Handler; // add accessor
MyEvent -= Handler; // remove accessor
MyEvent(this, EventArgs.Empty); // not supported by an accessor
另一个名为invoke
的访问者是否应该对此负责?我的想法是:
class BaseClass
{
public virtual event EventHandler MyEvent { add; remove; protected invoke; }
}
class DerivedClass : BaseClass
{
public override event EventHandler MyEvent
{
invoke
{
// new code before event
base.MyEvent(this, ...);
// new code after event
}
}
}
我知道old-style pattern,即实现OnMyEvent(...)
方法。但这种方法有两个重要的缺点:
编辑:显然编译团队已经为此功能设计了(参见GetRaiseMethod()
)。
答案 0 :(得分:5)
这是故意的,因此您不会调用您不“拥有”的事件。
编辑(解决您的编辑问题):即使在继承的类中,也不清楚是否应该始终能够调用它。通常是的,因此常见的模式很好地阐述了:
On
)On
的受保护虚拟方法,该方法接受相应的EventArgs
并执行null
检查和调用。这种模式允许更大的灵活性;可以通过继承该方法来更改或省略事件或进行事件后处理。如果不存在任何方法,则事件调用是私有的。