清除实例或静态事件的所有事件侦听器

目录

介绍

使用代码

兴趣点


如果您需要清理事件,此代码段将为您提供帮助。通常,您必须使用+=-=,或者使用Wea​​kEventHandler().AddHandlerRemoveHandler。但有时,您可能需要更难的方法!

介绍

我们需要在关闭窗口时清理WPF可视化树。为此,我们在Window组件上开发了WPF行为。

关闭时,此行为刚刚穿过窗口的可视化树。采取每个组件并为此:

  • 清除所有绑定
  • 清除所有事件监听器(静态或非静态)
  • 设置dataContextnull

这有助于GC快速收集...

使用代码

执行清除事件部分的代码如下:

public static void ClearEvents(object instance)
{
    var eventsToClear = instance.GetType().GetEvents(
        BindingFlags.Public | BindingFlags.NonPublic
        | BindingFlags.Instance | BindingFlags.Static);

    foreach (var eventInfo in eventsToClear)
    {
        var fieldInfo = instance.GetType().GetField(
            eventInfo.Name, 
            BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
            
        if (fieldInfo.GetValue(instance) is Delegate eventHandler)
            foreach (var invocatedDelegate in eventHandler.GetInvocationList())
                eventInfo.GetRemoveMethod(fieldInfo.IsPrivate).Invoke(
                    instance, 
                    new object[] { invocatedDelegate });
    }
}

兴趣点

反射是一个非常强大的工具,但这一定不是主要的方式。这只能在关键场景中使用。

https://www.codeproject.com/Tips/5313978/Clear-All-Events-Listeners-of-an-Instance-or-Stati

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值