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;