如何在Visual Studio调试器中查看C#自动属性的支持字段?

Ian*_*ths 20 c# visual-studio

Visual Studio的调试器有时会进入无法计算表达式的状态.这可以防止它显示属性值.例如,如果您正在查看堆栈顶部报告的线程[Managed to Native Transition],并且您通过this"本地"窗口中的引用查看任何属性,则它们都会报告Cannot evaluate expression because a native frame is on top of the call stack.

当调试器处于此状态时,您仍然可以检查字段,因为这不需要执行代码的能力.(属性变得不可用的原因是调试器实际上运行getter来检索值.如果您所在的线程被隐藏在某些非托管代码中,则无法执行此操作.)

遗憾的是,存储C#auto属性值的编译器生成的字段不会显示在调试器中.(这些是名称相似的字段<MyProperty>__BackingField.)

我已经尝试在调试器选项中启用"在变量窗口中显示对象的原始结构"设置,但这似乎对这些隐藏字段没有帮助.

有没有办法让调试器向我显示编译器隐藏的字段?

或者,当通常的房产评估不可用时,还有其他方法可以发现汽车房产的支持字段的价值吗?


注意:在这种情况下,重写代码以使用手动实现的属性不是一个选项,因为我想知道其值的属性是在Microsoft库中.(具体来说,Open XML SDK.)这是一个自动属性,我无法改变它.

还要注意:简单地允许代码执行稍微进行以便它可以从本机代码转换返回不是一个选项,因为由于某种原因,代码已进入某种紧张的繁忙循环 - 它消耗了CPU核心,并且永远不会回来 (我正在尝试诊断这个问题,这就是为什么我试图找出对象的属性值是什么 - 我正在试图准确了解它是如何进入这种状态的.)

还有一点需要注意:这不是在自动属性访问支持字段的重复- 我的问题非常具体地说是在调试时读取值.

此外,如果它是相关的,我正在远程调试代码,因为它在Azure辅助角色上运行.该问题仅发生在该环境中.据我所知,这排除了本机调试,所以我甚至不能去查看陷入循环的代码 - 我不得不通过查看托管来尝试推断它是什么在它消失进兔子洞之前就已经运行的代码.

Igo*_*hov 1

假设您有一个类,其中包含您想要在调试器中查看的属性:

public class C
{
    // ...
    public int I { get; set; }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我相信以下监视表达式将起作用(c是类的实例C):

c.GetType().GetField("<I>k__BackingField",
    BindingFlags.Instance | BindingFlags.NonPublic).GetValue(c)
Run Code Online (Sandbox Code Playgroud)

我知道不太方便,但总比没有好。

  • 这不起作用,您从监视窗口得到与属性“无法计算表达式,因为本机框架位于调用堆栈顶部”相同的抱怨。[这里是一个快速示例程序](http://pastebin.com/xF15ppRF) 来测试它,只需启动该程序,然后在显示表单后暂停它。添加监视 `program.GetType().GetField("&lt;Test&gt;k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(program)`,单击按钮来评估函数,您将收到错误消息。 (3认同)