在Visual Studio中进行调试的过程中,如何在WPF / C#中查找当前已订阅事件的所有方法

时间:2018-11-12 15:02:04

标签: c# wpf debugging visual-studio-debugging

对于WPF来说我是一个新手,对于C#来说我还是一个新手,现在已经继承了一个C#/ WPF App,其中包含超过6万行代码(未使用MVVM,设计模式相当简单)。现在,我必须在UI中更改一个很小的东西,但是此控件非常关键,因此紧密地融入了整个解决方案中。我知道Visual Studio中的“实时可视树”功能,也知道实时属性资源管理器。但是,我想使用“ Live EVENT Explorer”之类的东西来查看向此控件的事件注册了哪些方法。我想要类似的东西:

a)可以查看当前某个事件(例如ListView的SelectionChanged事件)订阅了哪些方法。我的意思是“当前”,取决于选择了哪些单选按钮和复选框等,订阅的方法正在发生很大变化。因此,我想进行所有需要的选择,然后检查控件并查看哪些方法是订阅了其中一项活动。

b)例如,如果我更改控件中的选择,则有可能在此事件触发的第一个方法中立即停止。这样我就可以逐步完成以下所有代码?

你们中的任何一个人是否知道使用Visual Studio的内置功能是否可以实现这两个目标之一,以及如何做到这一点?还是那里有另一个工具可以实现这样的目标?

2 个答案:

答案 0 :(得分:2)

在大多数情况下,“查找所有引用”都应该包含此内容,但是如果事件不够独特(想象一下Button.Click),此操作将失败。

您可以在调试器中通过浏览到事件对象并检查_invocationList字段来访问它。如果未填充此字段,请查看_methodPtr字段。如果两个字段均为空,则没有人订阅。

_target是包含预订方法的对象。如果为null,则预订静态方法(进行标识much more tricky)。否则,您可以dump the method table的目标对象来查找预订的方法。

在Visual Studio中,调试工具提示使此操作变得容易。对于单播委托,将鼠标悬停在事件上会显示声明的类型和方法名称(如果需要,还可以使用Arity):

screencap showing debugger tooltip

对于多播,_invocationList接管:

screencap showing debugger tooltip

答案 1 :(得分:1)

您可以转到View所在的ListView,并在代码背后,将自己订阅ListView.SelectionChanged事件,并在事件处理过程中添加以下代码:

foreach(EventHandler subscriber in ListView.SelectionChanged.GetInvocationList())
{
        // etc
}

您可以从此处获取更多信息:

How do I get the subscribers of an event?

希望对您有所帮助。