博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 移除类中所有事件的绑定
阅读量:5047 次
发布时间:2019-06-12

本文共 2854 字,大约阅读时间需要 9 分钟。

原文:

单例中为防止多处注册事件引起异步触发时发生报错,网上找了一圈没找到想要的方法。

【异常类型】: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);                            }                        }                    }                }            }        }    }}
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

 

posted on
2019-08-08 22:40  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/11324340.html

你可能感兴趣的文章
yum 记一次安装时的报错
查看>>
跨域(一)
查看>>
git避免提交本地配置文件-来自同事的分享
查看>>
【题解】 [ZJOI2006]书架 (Splay)
查看>>
Django ORM那些相关操作
查看>>
三星830 SSD的Smart值POR Recovery Count
查看>>
base642photo
查看>>
二分查找和数组合并
查看>>
【Java例题】5.5 两个字符串中最长公共子串
查看>>
python数据类型二
查看>>
Python-字典
查看>>
OS X下su和sudo
查看>>
乙级(Basic Level) 1011 个位数统计
查看>>
实验三+040+薛龚
查看>>
【错误】【vscode】输出中文是乱码问题
查看>>
Topological Sor-207. Course Schedule
查看>>
/MD, /MT, /LD (Use Run-Time Library)
查看>>
pahlcon:循环调度(Dispatch Loop)或跳转
查看>>
Java学习--异常处理及其应用类
查看>>
HTTP协议
查看>>