当执行事件,一个可以提供代码add
和remove
事件处理程序.但是,可以通过三种方式访问事件:
MyEvent += Handler; // add accessor
MyEvent -= Handler; // remove accessor
MyEvent(this, EventArgs.Empty); // not supported by an accessor
Run Code Online (Sandbox Code Playgroud)
是否有另一个称为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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道旧式模式,即实现OnMyEvent(...)
方法.但这种方法存在两个重要缺点:
编辑:显然编译器团队已经为此功能设计了(参见参考资料GetRaiseMethod()
).
这是故意的,因此您不会调用您不"拥有"的事件.
编辑(以便编辑):即使在继承的类中,也不清楚是否应该始终能够调用它.通常是的,因此常见的模式很好:
On
)On
接受相应的,EventArgs
并且只进行null
检查和调用.这种模式允许更大的灵活性 可以通过继承该方法来更改或省略事件或进行事件后处理.如果不存在任何方法,则事件调用是私有的.