https://www.cnblogs.com/zszh/p/11321005.html

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

【异常类型】:ArgumentException
【异常信息】:该委托必须有一个目标(且仅有一个目标)。

结合网上资料整合了个方法

  1. /// <summary>
  2. /// 移除所有注册事件
  3. /// </summary>
  4. public void RemoveAllEvent()
  5. {
  6. var newType = this.GetType();
  7. foreach (var item in newType.GetEvents())
  8. {
  9. FieldInfo _Field = newType.GetField(item.Name, BindingFlags.Instance | BindingFlags.NonPublic);
  10. if (_Field != null)
  11. {
  12. object _FieldValue = _Field.GetValue(this);
  13. if (_FieldValue != null && _FieldValue is Delegate)
  14. {
  15. Delegate _ObjectDelegate = (Delegate)_FieldValue;
  16. Delegate[] invokeList = _ObjectDelegate.GetInvocationList();
  17. if (invokeList != null)
  18. {
  19. foreach (Delegate del in invokeList)
  20. {
  21. item.RemoveEventHandler(this, del);
  22. }
  23. }
  24. }
  25. }
  26. }
  27. }

静态类方法

  1. /// <summary>
  2. /// 移除此静态类指定事件名称的所有事件绑定
  3. /// </summary>
  4. /// <param name="eventname"></param>
  5. public static void RemoveAllEvent(string eventname)
  6. {
  7. System.Reflection.FieldInfo _Field = typeof(GlobalVariables).GetField(eventname, System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
  8. if (_Field != null)
  9. {
  10. object _FieldValue = _Field.GetValue(typeof(GlobalVariables));
  11. if (_FieldValue != null && _FieldValue is Delegate)
  12. {
  13. Delegate _ObjectDelegate = (Delegate)_FieldValue;
  14. Delegate[] invokeList = _ObjectDelegate.GetInvocationList();
  15. if (invokeList != null)
  16. {
  17. foreach (var item in typeof(GlobalVariables).GetEvents())
  18. {
  19. if (item.Name == eventname)
  20. {
  21. foreach (Delegate del in invokeList)
  22. {
  23. item.RemoveEventHandler(typeof(GlobalVariables), del);
  24. }
  25. break;
  26. }
  27. }
  28. }
  29. }
  30. }
  31.  
  32. }

测试:

  1. using System;
  2. using System.Reflection;
  3.  
  4. namespace FormTest
  5. {
  6. class Class1
  7. {
  8. public event Action OnTest;
  9. public event Action OnShow;
  10.  
  11. /// <summary>
  12. /// 移除所有注册事件
  13. /// </summary>
  14. public void RemoveAllEvent()
  15. {
  16. var newType = this.GetType();
  17. foreach (var item in newType.GetEvents())
  18. {
  19. FieldInfo _Field = newType.GetField(item.Name, BindingFlags.Instance | BindingFlags.NonPublic);
  20. if (_Field != null)
  21. {
  22. object _FieldValue = _Field.GetValue(this);
  23. if (_FieldValue != null && _FieldValue is Delegate)
  24. {
  25. Delegate _ObjectDelegate = (Delegate)_FieldValue;
  26. Delegate[] invokeList = _ObjectDelegate.GetInvocationList();
  27. if (invokeList != null)
  28. {
  29. foreach (Delegate del in invokeList)
  30. {
  31. item.RemoveEventHandler(this, del);
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  1. private void button7_Click(object sender, EventArgs e)
  2. {
  3. Class1 cla = new Class1();
  4. cla.OnShow += cla_OnShow;
  5. cla.OnShow += cla_OnShow;
  6. cla.OnTest += cla_OnTest;
  7.  
  8. cla.RemoveAllEvent();
  9. }
  10.  
  11. void cla_OnTest()
  12. {
  13. throw new NotImplementedException();
  14. }
  15.  
  16. void cla_OnShow()
  17. {
  18. throw new NotImplementedException();
  19. }

c# 移除类中所有事件的绑定的更多相关文章

  1. 为什么需要在 React 类组件中为事件处理程序绑定this?

    https://juejin.im/post/5afa6e2f6fb9a07aa2137f51 事件绑定作为回调函数参数传递给函数,丢失其上下文,执行的是默认绑定,不是隐式绑定 类声明和类表达式的主体 ...

  2. javascript中onload事件如何绑定及执行顺序

    onload事件,顾名思义就是为了js程序能够在网页加载成功过后进行执行.对于放在head里面的js来说,非常必要. 如何给网页绑定onload,主要有三种方式: window.onload=func ...

  3. 1 .net中自定义事件的步骤

    1 申明一个自定义的类并且继承事件的基类 public class ClientSocketModelConnectedEvent:EventArgs { private string param; ...

  4. C#中OnLoad事件和Form1_Load事件的区别

    在学习<GDI+高级编程>第二章的过程中遇到一个疑问,就是为何有的代码用的是覆写一个OnLoad事件,而平日里我用的一般是Form1_Load事件,这两个函数很相近,但是具体有什么关系呢? ...

  5. python 类中方法总结 --- 实例方法、类方法、静态方法

    在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...

  6. Jquery 移除 html中绑定的onClick事件

    HTML绑定示例: <button class="edit" onClick="showTurnEdit(this)">编辑</button& ...

  7. QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)

    因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了.因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windo ...

  8. WPF MVVM 架构 Step By Step(3)(把后台代码移到一个类中)

    我觉得大部分开发者应该已经知道怎么去解决这个问题.一般都是把后台代码(GLUE code)移动到一个类库.这个类库用来代表UI的属性和行为.任何代码当被移到一个类库中时都可以被编译成一个DLL,然后可 ...

  9. 错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.

    原文:错误:"ResourceDictionary"根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序.请移除 MouseLeftButtonDown 事件的事 ...

随机推荐

  1. SQLserver创建用户和给用户权限(学)

    数据库基础知识:http://blog.csdn.net/u014600432/article/details/39645701 在SQL Server中创建用户角色及授权(使用SQL语句):http ...

  2. java报错问题记录

    java.lang.NoSuchMethodError 运行时错误,再编译期一般不会出现这个问题.NoSuchMethodError中文意思是没有找到方法,遇到这个错误并不是说依赖的jar包.方法不存 ...

  3. js对象属性方法

    window对象方法方法: 1.alert():显示带有一段消息和确认按钮的警告框 2.prompt():显示可提示用户输入的对话框 3.fonfirm():显示带有一段消息以及确认按钮和取消按钮的对 ...

  4. 在linux中怎么查看错误日志

    cat或者tail -f命令 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一/var/log/secure 与安全 ...

  5. HTTP GET POST PUT DELETE 四种请求

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  6. java面试填坑解惑篇

    感谢原文出处:https://www.cnblogs.com/javazhiyin/ NO1.请简单描述JDK和JRE的区别? NO1.回答JDK和JRE的区别这道题,首先要回答两个名次的概念,JDK ...

  7. 初学JavaScript正则表达式(十二)

    text / exec方法 text() var reg1 = /\w/; var reg2 = /\w/g; reg1.test('a') === true reg2.test('a') === t ...

  8. 2. Linux文件与目录管理

    一.目录与路径 1. 相对路径与绝对路径 绝对路径:路径写法[一定由根目录 / 写起],如:/usr/share/doc 相对路径:路径写法[不由 / 写起], /usr/share/doc 要到 / ...

  9. logistic 回归(线性和非线性)

    一:线性logistic 回归 代码如下: import numpy as np import pandas as pd import matplotlib.pyplot as plt import ...

  10. Java基本数据类型转换二

    public class TestConvert2 { /** * @param args */ public static void main(String[] args) { // TODO Au ...