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

时间:2011-06-14 04:50:37

标签: c# .net debugging

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

1 个答案:

答案 0 :(得分:4)

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

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

    如果没有附加事件处理程序,

    TestEvent将为null。

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

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

    ((System.Reflection.RuntimeMethodInfo)(((System.Delegate)(TestEvent))._methodBase)).Name
    

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

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

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

    ((System.Reflection.RuntimeMethodInfo)(((System.Delegate)(((object[])(((System.MulticastDelegate)(TestEvent))._invocationList))[0]))._methodBase)).Name
    

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

  4. 除了使用只是处理程序方法名称的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的列表。这些都是这个特定事件的处理者。
    11. enter image description here