原文: View Code View Code
单例中为防止多处注册事件引起异步触发时发生报错,网上找了一圈没找到想要的方法。
【异常类型】:ArgumentException
【异常信息】:该委托必须有一个目标(且仅有一个目标)。结合网上资料整合了个方法
////// 移除所有注册事件 /// 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; ////// 移除所有注册事件 /// 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); } } } } } } }}
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(); }
posted on 2019-08-08 22:40 阅读( ...) 评论( ...) 收藏