C#通过反射移除控件eventhandler方法参考

简介: 方法一:去除事件 public static class EventExtension {     public static void RemoveEvents(this Control...

方法一:
去除事件

public static class EventExtension

{
    public static void RemoveEvents(this Control target,string Event)
    {
            FieldInfo f1 = typeof(Control).GetField(Event,BindingFlags.Static | BindingFlags.NonPublic);
            object obj = f1.GetValue(target.CastTo());
            PropertyInfo pi =target.CastTo().GetType().GetProperty("Events",
                BindingFlags.NonPublic | BindingFlags.Instance);
            EventHandlerList list = (EventHandlerList)pi.GetValue(target.CastTo(), null);
            list.RemoveHandler(obj, list[obj]);
    }
}
使用方法:
Button button=new Button();
button.RemoveEvents
URL:http://stackoverflow.com/questions/91778/how-to-remove-all-event-handlers-from-a-control

来自博客:
http://www.cnblogs.com/z2002m/archive/2011/04/26/2029457.html

方法二
    public static class RemoveCtrlEvent
    {
        public static void RemoveEvents(this Control target, string eventName)
        {
            if (target == null) return;
            if (string.IsNullOrEmpty(eventName)) return;

            BindingFlags bPropertyFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic;//筛选
            BindingFlags fieldFlags = BindingFlags.Static | BindingFlags.NonPublic;
            Type ctrlType = typeof(System.Windows.Forms.Control);
            PropertyInfo pInfo = ctrlType.GetProperty("Events", bPropertyFlags);
            EventHandlerList evtHLst = (EventHandlerList)pInfo.GetValue(target, null);//事件列表
            FieldInfo fieldInfo = (typeof(Control).GetField("Event" + eventName, fieldFlags));
            Delegate d = evtHLst[fieldInfo.GetValue(target)];

            if (d == null) return;
            EventInfo eventInfo = ctrlType.GetEvent(eventName);

            foreach (Delegate dx in d.GetInvocationList())
            {
                //移除已订阅的eventName类型事件
                eventInfo.RemoveEventHandler(target, dx);
            }
        }
    }

来自博客:
http://blog.sina.com.cn/s/blog_6fd674050100oemh.html
相关文章
|
程序员 C# 数据库
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
329 5
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
833 3
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
796 2
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
307 1
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
590 1
|
C#
C#的方法的参数传递
C#的方法的参数传递
346 0
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
433 0
|
10月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
423 19
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
469 3
|
11月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
2345 0