如果它是在当前类型中声明的类字段事件,则只能测试/调用事件。所以:有两种情况会导致这种情况:
它不是类似字段的事件,但具有自定义add
/remove
访问器:在这种情况下,只有您的自定义代码知道委托的存储方式
它没有在当前类型中声明,而是在基类型或一些不相关的对象中:在这种情况下,您需要获取声明类型来调用事件,通常通过OnCustomEvent
方法。在基类型的情况下,约定是创建这个方法protected virtual
,它允许子类调用事件并通过override
(评论)
它看起来像案例1。但是,我不明白如何解决这个问题。
如果您有自定义add
/ remove
,那么如何调用它是特定于实现的(如果我能看到add
/ ,我可以告诉您更多信息remove
),但让我们看一下两个常见的实现:
1a:支持代表:
private EventHandler someEvent;
public event EventHandler SomeEvent
{
add { someEvent += value; }
remove { someEvent -= value; }
}
在这种情况下,“调用”实现将很简单:
if(someEvent != null) someEvent(this, EventArgs.Empty);
或者如果您感到格外小心:
var handler = someEvent;
if(handler != null) handler(this, EventArgs.Empty);
1b:an EventHandlerList
(用于稀疏事件):
private static readonly object SomeEventKey = new object();
public event EventHandler SomeEvent
{
add { Events.AddHandler(SomeEventKey, value); }
remove { Events.RemoveHandler(SomeEventKey, value); }
}
在这种情况下,调用实现将是:
var handler = (EventHandler)Events[SomeEventKey];
if(handler != null) handler(this, EventArgs.Empty);