Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除事件?_C#_Events - Fatal编程技术网

C# 如何删除事件?

C# 如何删除事件?,c#,events,C#,Events,我正在添加这样一个事件 Button button = new Button(); button.Click += (o,e) => { //Somecode }; 如何删除此事件?简短的回答是:您不能,您只能通过-=删除事件的处理程序。如果要删除处理程序,请不要使用匿名方法。而是使用预定义的方法,如: button.Click += OnButtonClick; private void OnButtonClick(object sender, EventArgs e) {

我正在添加这样一个事件

Button button = new Button();

button.Click += (o,e) =>
{
//Somecode
};

如何删除此事件?

简短的回答是:您不能,您只能通过-=删除事件的处理程序。如果要删除处理程序,请不要使用匿名方法。而是使用预定义的方法,如:

button.Click += OnButtonClick;

private void OnButtonClick(object sender, EventArgs e)
{
    //some code
} 
正确的语法是

button.Click += (o, e) => {  /*code*/ };
你不能删除它,因为它是一种无粘菌的方法。如果希望能够删除事件处理程序,则必须将代码移动到一个额外的方法

如果将lambda另存为委托:

EventHandler<EventArgs> handler = (o, e) => {  //code };
然而,我强烈建议不要这样做。改用命名方法。

这可能会有所帮助

        Button btn = new Button();
        this.Controls.Add(btn);
        btn.Click += (o, x) =>
        {
            Button b = o as Button;
            FieldInfo eventclick = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
            object eventValue = eventclick.GetValue(b);
            PropertyInfo events = b.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
            EventHandlerList eventHandlerList = (EventHandlerList)events.GetValue(b, null);
            eventHandlerList .RemoveHandler(eventValue, eventHandlerList [eventValue]);
            MessageBox.Show("Test");
        };

如果存储委托,则可以执行此操作

Button button=new Button();

EventHandler<...> handler=(o,e)=>
{
//Somecode
}

button.Click+=handler;
button.Click-=handler;

但我建议改用命名方法。我认为在这里使用lambda没有任何好处。

如何添加这样的事件?这甚至不会编译。它缺少+=,但其余代码是有效代码,它是一个lambda方法。与其删除事件添加类成员以充当某种标志,不如在引发时忽略单击。请参阅或。本质:您需要将匿名方法保存到一个变量中。+1,对于lambda-way,实际上正在考虑它的外观。+1最接近OP询问的语法错误。不需要在匿名委托上使用命名方法,只是建议这样做。
Button button=new Button();

EventHandler<...> handler=(o,e)=>
{
//Somecode
}

button.Click+=handler;
button.Click-=handler;