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 事件的事 ...
随机推荐
- 重新认识快速视图窗体(Quick View Form)
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复158或者20151009可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 在我的 微软Dynamics C ...
- Java垃圾收集器——Parallel、G1收集器日志分析及性能调优示范
开发过程中,经常需要对GC的垃圾收集器参数不断的进行动态调整,从而更充分的压榨机器性能,提升应用效率.本文将从常见的Parallel/G1垃圾收集器的GC日志着手,分析GC日志的具体含义,以及示范如何 ...
- 如何把转入成功的XXX.sql导入到自己的数据库里
1.新建自己的mysql连接,mysql连接名随便起,如cxf 密码尽量写123456或者root,防止忘记.按照图示右键(如果想在已有的mysql连接基础上建立数据库连接直接看第二步) 2.右键名 ...
- win10python安装iis
django部署iis https://www.cnblogs.com/guangang/articles/9268644.html python部署iis https://www.cnblogs.c ...
- Oracle存储过程(包:PACK_KPI_KERNEL For YS三度评价体系)
CREATE OR REPLACE PACKAGE PACK_KPI_KERNEL IS --定义多级数组 字符串 TYPE TSTRARRY ) INDEX BY BINARY_INTEGER; T ...
- day57 choise字段与ajax
一.choice字段. 在django的orm中,创建如同性别,民.族等可选择的字段时,可以选择使用choice字段进行定义. 这样的定义可以使用简单的数字代替数据量大的字符,减少数据库的负担. ch ...
- 新建全色或者resize(毫无价值,只是做记录)
import glob import os,sys import shutil import numpy as np import cv2 import matplotlib.pyplot as pl ...
- CentOs篇
Advanced-高级配置.Security-安全.Boot-启动引导: 1.Removable Devices-移动设备 2.Hard Drive-本地硬盘 3.CD-ROM- Drive-光盘 4 ...
- Mybatis的Java API(八)
使用mybatis的主要Java接口就是SqlSession.可以通过这个接口来执行命令,获取映射器和事务管理. SqlSession是由SqlSessionFactory实例创建,SqlSessio ...
- 并行计算:并行I/O服务器的操作参数
视频来源:新竹清华大学:并行计算与并行编程课程 上图结论:随着年限,计算力的增长很快,而I/O近于平缓,二者之间的差距增大,带来不利的影响.需要一些方法来处理这较大的差距. 解决方案: 1:I/O 内 ...