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# 移除类中所有事件的绑定的更多相关文章

  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. VMWare虚拟机应用介绍

    目录 一:VMWare简介 二:VMWare启动第一个虚拟机 一:VMWare简介   VMWare虚拟机软件是一个"虚拟PC"软件,它使你可以在一台机器上同时运行二个或更多Win ...

  2. mysql - 锁及事务的认识

    mysql事务特性:一致性原子性隔离性持久性 //mysql 事务隔离级别 读未提交 读未提交的数据 读已提交 读已提交的数据 串行序列化 一个事务完成了再执行另一个事务 可重复读(数据库默认) 就算 ...

  3. C#WinForm解决跨线程访问控件属性报错

    方式一(在程序初始化构造函数中加一行代码): public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCal ...

  4. (一)创建新的react native 应用程序

    最近开始学习ReactNative了,首先了解下ReactNative http://wiki.jikexueyuan.com/project/react-native/GettingStarted. ...

  5. python3基础学习(1)

    python基础内容讲解主要内容: 1.使用编辑器(IDE) 2.第一个“hello world” 3.何所谓“变量” 4.python与其他主流语言输出对比 5.数据类型 6.python用作“计算 ...

  6. springboot + shiro + mysql + mybatis 工程快速搭建

    1. 新建 springboot 工程 2. 随便起个名字 3. 初始化工程 4. 导入 shiro 和 thymeleaf 依赖 <!-- thymeleaf依赖 --> <dep ...

  7. python的gRPC示例

    参考URL: https://segmentfault.com/a/1190000015220713?utm_source=channel-hottest gRPC 是一个高性能.开源和通用的 RPC ...

  8. SpringCloud学习笔记(九、SpringCloud Stream)

    目录: 什么是SpringCloud Stream 如何使用SpringCloud Stream 消息分流 什么是SpringCloud Stream: SpringCloud Stream是一个用于 ...

  9. TeamyinyinFish-> 测试报告

    测试人员 1. 姓名:鱼嘤嘤 2. 年龄: 21 3. 职业: 大三学生 4. 感情状况: 单身 用户故事 软件工程课上,老师想要他们组实现一个小组项目,鱼嘤嘤原本想摸鱼,但是转念一想觉得 还是需要好 ...

  10. 解决飞秋绑定TCP错误

    电脑不能打开网页,局域网的飞秋不能运行:提示TCP/IP错误,错误事件代码:10106.重装TCP/IP协议后就OK了…… 步骤如下:1.删除这两个注册表选项:(打开注册表命令regedit.如果不能 ...