NET问答: 如何从 event 中移除所有的 handler ?
生活随笔
收集整理的這篇文章主要介紹了
NET问答: 如何从 event 中移除所有的 handler ?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咨詢區
Carrick:
我知道在 Control 上如何新建一個 Handler。
c.Click?+=?new?EventHandler(mainFormButton_Click);或者這樣
c.Click?+=?mainFormButton_Click;也知道如何從 event 上移除一個 handler。
c.Click?-=?mainFormButton_Click;現在的疑問是:如果簡單粗暴的從一個 event 上移除所有的 handler 呢?
回答區
azheglov:
我在 MSDN 上發現了一個解決方案:https://social.msdn.microsoft.com/Forums/en-US/576f69e7-55aa-4574-8d31-417422954689/get-a-list-of-delegate-on-event?forum=csharpgeneral ?比如下面的代碼可以幫助你移除 button1 控件上所有的 click 事件。
public?partial?class?Form1?:?Form {public?Form1(){InitializeComponent();button1.Click?+=?button1_Click;button1.Click?+=?button1_Click2;button2.Click?+=?button2_Click;}private?void?button1_Click(object?sender,?EventArgs?e)??=>?MessageBox.Show("Hello");private?void?button1_Click2(object?sender,?EventArgs?e)?=>?MessageBox.Show("World");private?void?button2_Click(object?sender,?EventArgs?e)??=>?RemoveClickEvent(button1);private?void?RemoveClickEvent(Button?b){FieldInfo?f1?=?typeof(Control).GetField("EventClick",?BindingFlags.Static?|?BindingFlags.NonPublic);object?obj?=?f1.GetValue(b);PropertyInfo?pi?=?b.GetType().GetProperty("Events",??BindingFlags.NonPublic?|?BindingFlags.Instance);EventHandlerList?list?=?(EventHandlerList)pi.GetValue(b,?null);list.RemoveHandler(obj,?list[obj]);} }Vinicius Schneider:
上面這幫人的解決方案都太復雜了,我有一個非常簡單粗暴的解決辦法。
public?class?MyMain()public?void?MyMethod()?{AnotherClass.TheEventHandler?+=?DoSomeThing;}private?void?DoSomething(object?sender,?EventArgs?e)?{Debug.WriteLine("I?did?something");AnotherClass.ClearAllDelegatesOfTheEventHandler();}}public?static?class?AnotherClass?{public?static?event?EventHandler?TheEventHandler;public?static?void?ClearAllDelegatesOfTheEventHandler()?{foreach?(Delegate?d?in?TheEventHandler.GetInvocationList()){TheEventHandler?-=?(EventHandler)d;}} }點評區
這個問題有很多的留言,有反射的,也有用 List 緩存的,其實 deletege 里面本身就有一個 list 數組,里面存放著就是那一堆 handler,所以 Vinicius Schneider 大佬提供的這種方式值得學習。
總結
以上是生活随笔為你收集整理的NET问答: 如何从 event 中移除所有的 handler ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#不可变类型
- 下一篇: Dotnet Core应用跨框架版本运行