欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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();
        }

c# 移除类中所有事件的绑定c# 移除类中所有事件的绑定