NET问答: 如何从 event 中移除所有的 handler ?

咨询区

  • Carrick

我知道在 Control 上如何新建一个 Handler。


c.Click += new EventHandler(mainFormButton_Click);

或者这样


c.Click += mainFormButton_Click;

也知道如何从 event 上移除一个 handler。


c.Click -= mainFormButton_Click;

现在的疑问是:如果简单粗暴的从一个 event 上移除所有的 handler 呢?

回答区

  • azheglov

我在 MSDN 上发现了一个解决方案:https://social.msdn.microsoft.com/Forums/en-US/576f69e7-55aa-4574-8d31-417422954689/get-a-list-of-delegate-on-event?forum=csharpgeneral  比如下面的代码可以帮助你移除 button1 控件上所有的 click 事件。


public partial class Form1 : Form
{public Form1(){InitializeComponent();button1.Click += button1_Click;button1.Click += button1_Click2;button2.Click += button2_Click;}private void button1_Click(object sender, EventArgs e)  => MessageBox.Show("Hello");private void button1_Click2(object sender, EventArgs e) => MessageBox.Show("World");private void button2_Click(object sender, EventArgs e)  => RemoveClickEvent(button1);private void RemoveClickEvent(Button b){FieldInfo f1 = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);object obj = f1.GetValue(b);PropertyInfo pi = b.GetType().GetProperty("Events",  BindingFlags.NonPublic | BindingFlags.Instance);EventHandlerList list = (EventHandlerList)pi.GetValue(b, null);list.RemoveHandler(obj, list[obj]);}
}
  • Vinicius Schneider

上面这帮人的解决方案都太复杂了,我有一个非常简单粗暴的解决办法。


public class MyMain()public void MyMethod() {AnotherClass.TheEventHandler += DoSomeThing;}private void DoSomething(object sender, EventArgs e) {Debug.WriteLine("I did something");AnotherClass.ClearAllDelegatesOfTheEventHandler();}}public static class AnotherClass {public static event EventHandler TheEventHandler;public static void ClearAllDelegatesOfTheEventHandler() {foreach (Delegate d in TheEventHandler.GetInvocationList()){TheEventHandler -= (EventHandler)d;}}
}

点评区

这个问题有很多的留言,有反射的,也有用 List 缓存的,其实 deletege 里面本身就有一个 list 数组,里面存放着就是那一堆 handler,所以 Vinicius Schneider 大佬提供的这种方式值得学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ddr4服务器内存频率_镁光出样DDR5内存;紫光发布P5160系列SSD!

今 日 资 讯 1镁光出样DDR5内存2020年AMD、Intel即将推出的新一代CPU处理器还会支持DDR4内存,但是下一代DDR5内存已经近在眼前,2021年就会正式上市。近日镁光宣布开始向客户出样最新的DDR5内存,基于1Znm工艺,性能提升了…

计算机态,(计算机)有限态自动机,FSM(finite state machine),音标,读音,翻译,英文例句,英语词典...

补充资料:ω-有限自动机ω-有限自动机ω-finite state automata1094。一youx一anz}dongJ-。.有限自动机(。一rinite state automata)一种在无限串上运行的有限状态自动机,是一种。一语言的识别模型。主要研究。一的各种识别方式以及在通常的五种识别条件…

数据时代,信息的无处遁形

从数据中抽取信息从信息中挖掘知识随着大数据时代的到来,数据挖掘的重要性越发显著。可谓是兵马未至,数据先行。所谓数据挖掘,一般是指从大型数据库中将隐藏的预测信息抽取出来的过程,而更为精确的解释就是“从数据中挖掘知识”。…

artDialog对话框在PHP下的简单应用-artDialog弹出层篇

本教程使用的是artDialog 4.1.7版本,由于需要iframe的支持,所以选择这个版本,artDialog 5.0.3不支持iframe。 本教程是基于本站站长在网页设计写代码过程中与PHP页面交互的应用,部分表单类功能基于artDialog iframe来完成的。也许…

Dotnet Core应用跨框架版本运行

有时候,我们真想用新框架,可也真不想改代码。有一个前置的知识需要了解,就是微软 Dotnet Core 框架的版本体系。我前边的文章「Dotnet Core使用特定的SDK&Runtime版本」有详细的说明,可以去翻翻看。前言有一个旧应用&#xff…

服务器运行慢都有哪些问题,服务器数据库的运行速度很慢问题

我的服务器运行速度很慢。察看oracle进程。显示如下:oracle7 26111 26087 0 Apr-29 ? 00:00:04 oracledfjforacle7 5268 1 0 13:40:11 ? 00:00:01 oracledfjf (LOCALNO)oracle7 25169 1 0 15:05:48 ? 00:00:00 ora_dbw…

dw自动滚动图片_3分钟搞定图片懒加载

什么是图片懒加载图片的懒加载就是在页面打开的时候,不要一次性全部显示页面所有的图片,而是只显示当前视口内的图片,一般在移动端使用(PC端主要是前端分页或者后端分页)。为什么需要懒加载对于一个页面加载速度影响最…

获利40多万,工地技术员自学开发外挂被抓

全世界只有3.14 % 的人关注了数据与算法之美今年年初,江苏省公安厅召开新闻发布会,通报全省公安机关开展“净网”专项行动战果。随后平安江苏 在微博中公布了多个案件,其中有个涉及利用技术定位侵犯公民个人信息的案件。【案发】欠债老板在吃…

使用C#在VS Code中编写Notebook

提到大名鼎鼎的Jupyter Notebook,大家应该都听说过。它是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。但是Jupyter Notebook需要使用Python编写代码,对.Neter不太友好。不过,…

缓慢渐变维度的处理方式

维度可以根据变化剧烈程度主要分为无变化维度、缓慢变化维度和剧烈变化维度。例如一个人的相关信息,身份证号、姓名和性别等信息数据属于不变的部分,政治面貌和婚姻状态属于缓慢变化部分,而工作经历、工作单位和培训经历等在某种程度上属于急…

显卡mx150和230哪个好_建模渲染用专业图形显卡和游戏显卡哪个更好?

最近很多朋友让小杨写配置单顺带装机,70%的用户是游戏需求,20%的是设计需求,为数不多的是办公需求,那么问题来了,建模渲染用专业图形显卡和游戏显卡哪个更好?下面小杨给大家深度剖析一番。(建模渲染)今天小…

计算机录取高考生过程,解密高考录取过程:人机结合 打造“阳光高招”

考生的档案怎么被投到志愿高校?每个院校的录取分数线怎么划定?哪些学生容易被退档?15日下午,记者随部分省人大代表探访设在大学城的高招录取现场,为您详解高招录取关键环节。先来看下文史、理工类本一批次实行的按院校平行志愿的网上录取的大致流程&a…

每日一笑 | 如果把大脑看成CPU的话...

全世界只有3.14 % 的人关注了数据与算法之美(图片来源于网络,侵权删)

C# 三种方式实现Socket数据接收(经典)

Stream.Read 方法当在派生类中重写时,从当前流读取字节序列,并将此流中的位置提升读取的字节数。语法:public abstract int Read(byte[] buffer, int offset, int count)参数:buffer: 字节数组。此方法返回时,该缓冲区…

SQL Sever 性能调优

checkpoint dbcc dropcleanbuffers dbcc freeproccache dbcc freesystemcache(All) dbcc opentran 如何查看磁盘I/O操作信息 SET STATISTICS IO ON 命令是一个 使 SQL Server 显示有关由 Transact-SQL 语句生成的磁盘活动量的信息。 我们在分析索引性能的时候&…

服务器运维监控指标,运维体系~指标监控~Prometheus监控告警与日志

一 Prometheus 入门1.1 入门介绍运维体系~指标监控先来一张图,说明一下Prometheus监控相关的软件和知识点。1: 首先要安装:Prometheus, 负责收集各种监控指标,也包括自己定监控2: 接着安装Grafana全面瓦解,负责展示监控指标3:接着…

小肚皮最新版本_小肚皮官方版下载_小肚皮app - Win7旗舰版

小肚皮app是一款健康瘦身应用,小肚皮APP倡导快乐健康的减肥方式,卡路里的查询功能和一些激励功能让用户互相鼓励监督,告别垃圾食品,一起管住嘴吧!同时收录了多种网友提供热门并安全健康的减肥方案,用户可根据自己的身体…

限时秒杀┃月销10000+件,风靡全国的steam科学实验套装

▲数据汪特别推荐点击上图进入玩酷屋之前小木有推荐过“彩虹实验”,这款是可以让孩子在探索中能够独立思考,主动地构建知识库,培养创造力。(传送门)让孩子们在家开展科学游戏,既能提升动手能力,…

面向.NET开发人员的Dapr——入门

目录:面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰DaprGet started with DaprDapr 入门In the first two chapters, you learned basic concepts about Dapr. Its time to take it for a test drive. This c…

比乐高还要好玩,50种奇妙装置玩法,将STEM教育一网打尽

▲数据汪特别推荐点击上图进入玩酷屋致砖《小小机器人》套装全新首发电动机械的完美结合先来看看视频过过眼瘾吧来自美国STEAM教育让孩子跨学科学知识积木向来是STEAM教育很重要的一部分,因为它涉及到了多种学科:要搭建得稳固——这是工程学;…