如何在QuickWatch中检查是否分配了事件处理程序

has*_*shi 6 .net c# debugging

我需要知道如何检查已分配的任何事件处理程序?(在QuickWatch中)

Ale*_*Aza 4

我不确定我是否正确理解了这个问题,但我会尝试一下:

  1. 如何检查是否有任何事件处理程序附加到事件TestEvent

    TestEvent如果没有附加事件处理程序,则将为 null。

  2. 如果附加了一个处理程序(单播委托)_invocationList == 0

    将以下内容粘贴到 QuickWatch 表达式字符串:

    ((System.Reflection.RuntimeMethodInfo)(((System.Delegate)(TestEvent))._methodBase)).Name
    
    Run Code Online (Sandbox Code Playgroud)

    找出附加的事件处理程序。

  3. 如果附加了多个处理程序(多播委托)_invocationList > 0

    您需要仔细查看_invocationList,例如检查第一个附加方法:

    ((System.Reflection.RuntimeMethodInfo)(((System.Delegate)(((object[])(((System.MulticastDelegate)(TestEvent))._invocationList))[0]))._methodBase)).Name
    
    Run Code Online (Sandbox Code Playgroud)

    要检查其他附加的处理程序:将索引更改为 1、2 等,或者仅扩展数组的每个元素_invocationList

除了使用Name仅是处理程序方法名称的属性之外,您还可以使用m_toString作为方法签名的字段。

TestEvent在所有有关替换为您的活动名称的示例中。

[编辑]没有意识到您正在使用 WPF。WPF 事件系统要复杂得多。

假设您有一个按钮,并且要检查是否有任何处理程序附加到MouseLeftButtonDown事件:

  1. 打开 QuickWhatch。
  2. 粘贴按钮变量名称(假设button1)。
  3. 深入研究基础类,直到到达UIElement. 或者快速将其粘贴((System.Windows.UIElement)(button1)).EventHandlersStore到表达式输入中。
  4. 找到并扩展属性EventHandlersStore
  5. 扩张_entries
  6. 扩张_mapStore
  7. 扩张[MS.Utility....]
  8. _entry0您将看到, _entry1, ...的列表_entry_n。其中每一个都是按钮也分配有处理程序的事件。
  9. 要了解分配给哪些处理程序,请进一步钻取特定条目Value=> _listStore
  10. _entry0您将再次看到, ...的列表_entry1。这些是附加到该特定事件的所有处理程序。

在此输入图像描述