如何在.NET中分配事件

Mat*_*att 9 .net events

我刚刚意识到我并不完全理解为什么在.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中删除它们,并在通常触发事件的其他一些程序完成之后重新分配它们?

Sim*_*mon 3

第一个问题:是的,只要方法签名与事件的委托类型兼容,就可以做到。

第二个问题:是的,你也可以这样做。用于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()- 方法以使代码更具可读性。