样品....
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)
但是,如果我在活动中有太多的消息来源,我认为这非常难看......有人能告诉我最好的方法来取消活动吗?
您可以将事件处理程序/ lambda分配给一个变量,然后您可以订阅和取消订阅:
var myHandler = () => { };
sc.OnBeforeEditor += myHandler;
sc.OnBeforeEditor -= myHandler;
Run Code Online (Sandbox Code Playgroud)
我很确定你的代码不起作用:
并且,如果我像这样动态添加事件...↓
Run Code Online (Sandbox Code Playgroud)sc.OnBeforeEditor += () => { };我应该删除像↓这样的事件
Run Code Online (Sandbox Code Playgroud)sc.OnBeforeEditor -= () => { };
这是因为重新创建lambda会创建一个新的不同lambda.
您需要存储旧引用并使用它来取消订阅:
BeforeEditorHandle myHandler=() => { }
sc.OnBeforeEditor += myHandler;
...
sc.OnBeforeEditor -= myHandler;
Run Code Online (Sandbox Code Playgroud)
为了便于取消订阅,您可以在集合中收集事件处理程序(例如List<BeforeEditorHandle>).