我刚刚意识到我并不完全理解为什么在.NET中使用+ =符号分配事件.
昨天当我需要删除一个事件而不考虑我正在做的时候,我想出了这个
someobject.onsomeevent += null
Run Code Online (Sandbox Code Playgroud)
以为这会删除我之前分配的事件.
经过一番调查,我发现我必须这样做
someobject.onsomeevent -= someeventmethod;
Run Code Online (Sandbox Code Playgroud)
在搞清楚之后,我意识到我不明白如何在.NET中分配事件方法.
所以我有几个问题:
首先,这是否意味着我能做到
someobject.onsomeevent += someeventmethod;
someobject.onsomeevent += someeventothermethod;
Run Code Online (Sandbox Code Playgroud)
如果是这样,当onsomeevent发生时,它们都会被命中,并按照指定的顺序或同时进行?
此外,如何确定已将哪些事件方法分配给someobject.onsomeevent?
第二,有没有办法在某些类中保存事件方法,从someobject.onsomeevent中删除它们,并在通常触发事件的其他一些程序完成之后重新分配它们?
第一个问题:是的,只要方法签名与事件的委托类型兼容,就可以做到。
第二个问题:是的,你也可以这样做。用于EventTest.GetInvocationList()获取注册到您的事件的方法。然后使用-=和+=分别删除和重新添加委托。请参阅下面的示例:
public class Test
{
public event EventHandler EventTest = delegate { };
public void Method()
{
//get registered event handlers
Delegate[] invocationList = EventTest.GetInvocationList();
//remove them
foreach (Delegate d in invocationList)
{
EventTest -= (EventHandler)d;
}
//this method won't trigger anything, because
//invocation list is empty
Method2();
//re-add event handlers
foreach (Delegate d in invocationList)
{
EventTest += (EventHandler)d;
}
}
public void Method2()
{
if(EvenTest != null)
EventTest(this, EventArgs.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
我删除了琐碎的Main()- 方法以使代码更具可读性。