反射方法获取事件的委托链上的函数

简介:

 

 

复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;


namespace TestDev
{
    class Program
    {
        static void Main(string[] args)
        {
        
            System.Windows.Forms.Button btn = new System.Windows.Forms.Button();
            btn.Click += new EventHandler(btn_Click);
            btn.Click += new EventHandler(btn_Click2);
            btn.Click += new EventHandler(btn_Click3);
            btn.MouseMove += btn_MouseMove;
            btn.MouseMove += btn_MouseMove2;
            
            PropertyInfo pi = btn.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
            EventHandlerList ehl = (EventHandlerList)pi.GetValue(btn, null);//EventClick
            FieldInfo fieldInfo = (typeof(System.Windows.Forms.Control)).GetField("EventMouseMove", BindingFlags.Static | BindingFlags.NonPublic);
            Delegate d = ehl[fieldInfo.GetValue(null)];
            foreach (Delegate del in d.GetInvocationList())
                Console.WriteLine(del.Method.Name);
           

        }

        static void btn_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        static void btn_MouseMove2(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        static void btn_Click(object sender, EventArgs e)
        {
            Console.WriteLine("Click1");
        }
 
        static void btn_Click2(object sender, EventArgs e)
        {
            Console.WriteLine("Click2");
        }
 
        static void btn_Click3(object sender, EventArgs e)
        {
            Console.WriteLine("Click3");
        }
        
    }
}
复制代码

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。


    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6932445.html ,如需转载请自行联系原作者




相关文章
|
Java
SpringBoot实现文件上传接口
文件上传是很多业务场景需要实现的功能,今天就简单以Springboot框架为基础实现文件上传的接口。
2598 0
SpringBoot实现文件上传接口
|
6月前
|
存储
微信附近人提取工具,附近人微信号采集,用xposed实现【仅供学习参考】
主Hook模块拦截微信附近人界面,数据结构保存用户信息,数据导出模块实现CSV格式存储,以及Xposed框架入口配置。
|
Java Spring
SpringBoot入门 - 定制自己的Banner
SpringBoot入门 - 定制自己的Banner
215 2
SpringBoot入门 - 定制自己的Banner
|
12月前
|
消息中间件 存储 中间件
说说MQ在你项目中的应用(二)商品支付
本文总结了消息队列(MQ)在支付订单业务中的应用,重点分析了RabbitMQ的优势。通过异步处理、系统解耦和流量削峰等功能,RabbitMQ确保了支付流程的高效与稳定。具体场景包括用户下单、支付请求、商品生产和物流配送等环节。相比Kafka,RabbitMQ在低吞吐量、高实时性需求下表现更优,提供了更低延迟和更高的可靠性。
368 0
|
机器学习/深度学习 算法 搜索推荐
多任务学习模型之DBMTL介绍与实现
本文介绍的是阿里在2019年发表的多任务学习算法。该模型显示地建模目标间的贝叶斯网络因果关系,整合建模了特征和多个目标之间的复杂因果关系网络,省去了一般MTL模型中较强的独立假设。由于不对目标分布做任何特定假设,使得它能够比较自然地推广到任意形式的目标上。
|
机器学习/深度学习 并行计算 算法
ICASSP 2023论文模型开源|语音分离Mossformer
人类能在复杂的多人说话环境中轻易地分离干扰声音,选择性聆听感兴趣的主讲人说话。但这对机器却不容易,如何构建一个能够媲美人类听觉系统的自动化系统颇具挑战性。 本文将详细解读ICASSP2023本届会议收录的单通道语音分离模型Mossformer论文,以及如何基于开发者自有数据进行该模型的调优训练。
1003 0
|
安全 数据安全/隐私保护
阿里云企业实名认证和个人实名认证区别对比
2023阿里云企业实名认证和个人实名认证区别对比,阿里云账号根据实名认证主体分为个人认证和企业认证两种,企业实名认证和个人实名认证有什么区别?区别大了,如果公司的阿里云账号使用员工的个人身份进行实名认证,一旦员工离职,公司账号就找不回来了。阿里云百科来详细说下阿里云账号个人实名认证和企业实名认证的区别:
515 0
阿里云企业实名认证和个人实名认证区别对比
|
云安全 安全 数据安全/隐私保护
阿里云成为全球唯一完成德国C5云安全基础附加标准审计云服务商 数据安全获“最严谨”标准认可
12月14日,德国联邦信息安全局宣布阿里云完成德国C5云安全(Cloud Computing Compliance Controls Catalog)标准评审。 这样,阿里云成为全球首家,也是唯一一家审计报告覆盖所有C5标准基础要求和附加要求的云服务提供商。
|
存储 并行计算 Cloud Native
PolarDB 开源版 使用TimescaleDB 实现时序数据高速写入、压缩、实时聚合计算、自动老化等
PolarDB 开源版 使用TimescaleDB 实现时序数据高速写入、压缩、实时聚合计算、自动老化等
3086 3
|
安全 C语言 C++
Qt: 一个适用于Qt的httpserver 开源库介绍
Qt: 一个适用于Qt的httpserver 开源库介绍
1290 0