c# 移除类中所有事件的绑定
程序员文章站
2023-08-21 20:06:22
单例中为防止多处注册事件引起异步触发时发生报错,网上找了一圈没找到想要的方法。 【异常类型】: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); } } } } } } } }
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(); }