c# 移除类中所有事件的绑定
https://www.cnblogs.com/zszh/p/11321005.html
单例中为防止多处注册事件引起异步触发时发生报错,网上找了一圈没找到想要的方法。
【异常类型】: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);
- }
- }
- }
- }
- }
- }
静态类方法
- /// <summary>
- /// 移除此静态类指定事件名称的所有事件绑定
- /// </summary>
- /// <param name="eventname"></param>
- public static void RemoveAllEvent(string eventname)
- {
- System.Reflection.FieldInfo _Field = typeof(GlobalVariables).GetField(eventname, System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
- if (_Field != null)
- {
- object _FieldValue = _Field.GetValue(typeof(GlobalVariables));
- if (_FieldValue != null && _FieldValue is Delegate)
- {
- Delegate _ObjectDelegate = (Delegate)_FieldValue;
- Delegate[] invokeList = _ObjectDelegate.GetInvocationList();
- if (invokeList != null)
- {
- foreach (var item in typeof(GlobalVariables).GetEvents())
- {
- if (item.Name == eventname)
- {
- foreach (Delegate del in invokeList)
- {
- item.RemoveEventHandler(typeof(GlobalVariables), del);
- }
- break;
- }
- }
- }
- }
- }
- }
测试:
- 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# 移除类中所有事件的绑定的更多相关文章
- 为什么需要在 React 类组件中为事件处理程序绑定this?
https://juejin.im/post/5afa6e2f6fb9a07aa2137f51 事件绑定作为回调函数参数传递给函数,丢失其上下文,执行的是默认绑定,不是隐式绑定 类声明和类表达式的主体 ...
- javascript中onload事件如何绑定及执行顺序
onload事件,顾名思义就是为了js程序能够在网页加载成功过后进行执行.对于放在head里面的js来说,非常必要. 如何给网页绑定onload,主要有三种方式: window.onload=func ...
- 1 .net中自定义事件的步骤
1 申明一个自定义的类并且继承事件的基类 public class ClientSocketModelConnectedEvent:EventArgs { private string param; ...
- C#中OnLoad事件和Form1_Load事件的区别
在学习<GDI+高级编程>第二章的过程中遇到一个疑问,就是为何有的代码用的是覆写一个OnLoad事件,而平日里我用的一般是Form1_Load事件,这两个函数很相近,但是具体有什么关系呢? ...
- python 类中方法总结 --- 实例方法、类方法、静态方法
在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...
- Jquery 移除 html中绑定的onClick事件
HTML绑定示例: <button class="edit" onClick="showTurnEdit(this)">编辑</button& ...
- QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)
因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了.因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windo ...
- WPF MVVM 架构 Step By Step(3)(把后台代码移到一个类中)
我觉得大部分开发者应该已经知道怎么去解决这个问题.一般都是把后台代码(GLUE code)移动到一个类库.这个类库用来代表UI的属性和行为.任何代码当被移到一个类库中时都可以被编译成一个DLL,然后可 ...
- 错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.
原文:错误:"ResourceDictionary"根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序.请移除 MouseLeftButtonDown 事件的事 ...
随机推荐
- SQLserver创建用户和给用户权限(学)
数据库基础知识:http://blog.csdn.net/u014600432/article/details/39645701 在SQL Server中创建用户角色及授权(使用SQL语句):http ...
- java报错问题记录
java.lang.NoSuchMethodError 运行时错误,再编译期一般不会出现这个问题.NoSuchMethodError中文意思是没有找到方法,遇到这个错误并不是说依赖的jar包.方法不存 ...
- js对象属性方法
window对象方法方法: 1.alert():显示带有一段消息和确认按钮的警告框 2.prompt():显示可提示用户输入的对话框 3.fonfirm():显示带有一段消息以及确认按钮和取消按钮的对 ...
- 在linux中怎么查看错误日志
cat或者tail -f命令 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一/var/log/secure 与安全 ...
- HTTP GET POST PUT DELETE 四种请求
1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...
- java面试填坑解惑篇
感谢原文出处:https://www.cnblogs.com/javazhiyin/ NO1.请简单描述JDK和JRE的区别? NO1.回答JDK和JRE的区别这道题,首先要回答两个名次的概念,JDK ...
- 初学JavaScript正则表达式(十二)
text / exec方法 text() var reg1 = /\w/; var reg2 = /\w/g; reg1.test('a') === true reg2.test('a') === t ...
- 2. Linux文件与目录管理
一.目录与路径 1. 相对路径与绝对路径 绝对路径:路径写法[一定由根目录 / 写起],如:/usr/share/doc 相对路径:路径写法[不由 / 写起], /usr/share/doc 要到 / ...
- logistic 回归(线性和非线性)
一:线性logistic 回归 代码如下: import numpy as np import pandas as pd import matplotlib.pyplot as plt import ...
- Java基本数据类型转换二
public class TestConvert2 { /** * @param args */ public static void main(String[] args) { // TODO Au ...