如何删除该事件?

she*_*bin 3 c# events

样品....

SampleClass:

public class SampleClass
{
    public delegate void BeforeEditorHandle();
    public event BeforeEditorHandle OnBeforeEditor;
}
Run Code Online (Sandbox Code Playgroud)

MainMethod

    static void Main(string[] args)
    {
        SampleClass sc = new SampleClass();
        // Add Event
        sc.OnBeforeEditor +=new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor);
        // Remove Event
        sc.OnBeforeEditor -= new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor);

    }
Run Code Online (Sandbox Code Playgroud)

并且,如果我像这样动态添加事件...↓

sc.OnBeforeEditor += () => {  };
Run Code Online (Sandbox Code Playgroud)

我应该删除像↓这样的事件

sc.OnBeforeEditor -= () => {  }; 
Run Code Online (Sandbox Code Playgroud)

但是,如果我在活动中有太多的消息来源,我认为这非常难看......有人能告诉我最好的方法来取消活动吗?

Ode*_*ded 8

您可以将事件处理程序/ lambda分配给一个变量,然后您可以订阅和取消订阅:

var myHandler = () => {  };

sc.OnBeforeEditor += myHandler;

sc.OnBeforeEditor -= myHandler;
Run Code Online (Sandbox Code Playgroud)


Cod*_*aos 6

我很确定你的代码不起作用:

并且,如果我像这样动态添加事件...↓

sc.OnBeforeEditor += () => {  };
Run Code Online (Sandbox Code Playgroud)

我应该删除像↓这样的事件

sc.OnBeforeEditor -= () => {  };
Run Code Online (Sandbox Code Playgroud)

这是因为重新创建lambda会创建一个新的不同lambda.

您需要存储旧引用并使用它来取消订阅:

BeforeEditorHandle myHandler=() => {  }
sc.OnBeforeEditor += myHandler;

...
sc.OnBeforeEditor -= myHandler;
Run Code Online (Sandbox Code Playgroud)

为了便于取消订阅,您可以在集合中收集事件处理程序(例如List<BeforeEditorHandle>).