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

时间:2013-11-07 16:38:02

标签: 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核心,永远不会返回。 (我正在尝试诊断这个问题,这就是我试图找出对象的属性值是什么的原因 - 我正在试图准确了解它是如何进入这种状态的。)

还有一个注释:这不是Acessing the backing field in an auto property的重复 - 我的问题非常具体,是关于在调试时读取值。

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

1 个答案:

答案 0 :(得分:1)

假设您有一个具有要在调试器中观看的属性的类:

public class C
{
    // ...
    public int I { get; set; }
    // ...
}

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

c.GetType().GetField("<I>k__BackingField",
    BindingFlags.Instance | BindingFlags.NonPublic).GetValue(c)

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