权美妍,张继钢,我的女友是机器人豆瓣
单例中为防止多处注册事件引起异步触发时发生报错,网上找了一圈没找到想要的方法。
【异常类型】: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(); }
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Net Core Web Api项目与在NginX下发布的方法
asp.net core3.1 引用的元包dll版本兼容性问题解决方案
IdentityServer4实现.Net Core API接口权限认证(快速入门)
ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径的实现
网友评论