gpt4 book ai didi

c# - 如何在 Visual Studio 调试期间查找当前订阅 WPF/C# 事件的所有方法

转载 作者:太空宇宙 更新时间:2023-11-03 22:39:15 25 4
gpt4 key购买 nike

我对 WPF 很陌生,对 C# 也很陌生,现在继承了一个代码超过 60k 行的 C#/WPF 应用程序(没有使用 MVVM,设计模式相当临时)。现在,我必须在 UI 中更改一个相当小的东西,但是这个控件非常重要,因此被大量地融入到整个解决方案中。我知道 Visual Studio 中的“Live Visual Tree”功能,也知道 Live Property Explorer。但是,我想要一个类似“Live EVENT Explorer”的东西来查看向该控件的事件注册了哪些方法。我想要这样的东西:

a) 可以查看哪些方法当前订阅了特定事件(例如 ListView 的 SelectionChanged 事件)。对于“当前”,我的意思是,根据选择的单选按钮和复选框等,订阅的方法发生了很大变化。所以我想做出我需要的所有选择,然后检查控件并查看哪些方法是订阅了其中一个事件。

b) 例如,如果我更改控件中的选择,则可以在此事件触发的第一个方法中立即停止。以便我可以单步执行以下所有代码?

你们中的任何人都知道是否可以使用 Visual Studio 中的内置函数实现其中​​任何一个,以及如何做到这一点?或者是否有其他工具可以实现这样的目标?

最佳答案

在大多数情况下,Find All References 应该涵盖它,但是当事件不够独特时,这会失败(想象一下 Button.Click)。

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

_target 是包含订阅方法的对象。如果它为空,则订阅一个静态方法(这使得标识为 much more tricky )。否则,您可以 dump the method table的目标对象找到订阅的方法。

在 Visual Studio 中,调试工具提示让这一切变得简单。对于单播委托(delegate),将鼠标悬停在事件上会显示声明类型和方法名称(如果需要,还有元数):

screencap showing debugger tooltip

对于多播,_invocationList 接管:

screencap showing debugger tooltip

关于c# - 如何在 Visual Studio 调试期间查找当前订阅 WPF/C# 事件的所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53264861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com