單例中為防止多處註冊事件引起非同步觸發時發生報錯,網上找了一圈沒找到想要的方法。 【異常類型】:ArgumentException【異常信息】:該委托必須有一個目標(且僅有一個目標)。 結合網上資料整合了個方法 測試: using System; using System.Reflection; na ...
單例中為防止多處註冊事件引起非同步觸發時發生報錯,網上找了一圈沒找到想要的方法。
【異常類型】:ArgumentException
【異常信息】:該委托必須有一個目標(且僅有一個目標)。
結合網上資料整合了個方法
/// <summary> /// 移除所有註冊事件 /// </summary> public void RemoveAllEvent() { var newType = this.GetType(); foreach (var item in newType.GetEvents()) { FieldInfo _Field = newType.GetField(item.Name, BindingFlags.Instance | BindingFlags.NonPublic); if (_Field != null) { object _FieldValue = _Field.GetValue(this); if (_FieldValue != null && _FieldValue is Delegate) { Delegate _ObjectDelegate = (Delegate)_FieldValue; Delegate[] invokeList = _ObjectDelegate.GetInvocationList(); if (invokeList != null) { foreach (Delegate del in invokeList) { item.RemoveEventHandler(this, del); } } } } } }
測試:
using System; using System.Reflection; namespace FormTest { class Class1 { public event Action OnTest; public event Action OnShow; /// <summary> /// 移除所有註冊事件 /// </summary> public void RemoveAllEvent() { var newType = this.GetType(); foreach (var item in newType.GetEvents()) { FieldInfo _Field = newType.GetField(item.Name, BindingFlags.Instance | BindingFlags.NonPublic); if (_Field != null) { object _FieldValue = _Field.GetValue(this); if (_FieldValue != null && _FieldValue is Delegate) { Delegate _ObjectDelegate = (Delegate)_FieldValue; Delegate[] invokeList = _ObjectDelegate.GetInvocationList(); if (invokeList != null) { foreach (Delegate del in invokeList) { item.RemoveEventHandler(this, del); } } } } } } } }View Code
private void button7_Click(object sender, EventArgs e) { Class1 cla = new Class1(); cla.OnShow += cla_OnShow; cla.OnShow += cla_OnShow; cla.OnTest += cla_OnTest; cla.RemoveAllEvent(); } void cla_OnTest() { throw new NotImplementedException(); } void cla_OnShow() { throw new NotImplementedException(); }View Code