发出的属性不会显示在调试器中

Emitted properties do not appear in the debugger

提问人:Mike Nakis 提问时间:10/8/2023 最后编辑:Mike Nakis 更新时间:10/10/2023 访问量:46

问:

我用于在运行时创建类,这些类实现包含方法和属性的各种接口。System.Reflection.Emit

在生成一个类时,我为该类应该实现的每个接口的每个接口的每个接口方法生成一个具体方法。

由于属性只是句法糖,(或者是吗?我不以任何方式处理它们:对于任何属性,接口都必须声明一对 and 方法,因此我的代码生成相应的具体方法,并且生成的类具有该属性,而无需任何额外处理。Fooget_Foo()set_Foo()

一切正常,除了一件烦人的事情:

当作为生成类的实例的对象显示在 Visual Studio 调试器的“局部变量”或“自动”窗口中时,如果我展开该对象的节点,则看不到任何属性及其值。他们只是没有显示。他们不在那里。他们似乎没有。

现在,有趣的是:如果我在 Visual Studio 调试器的“监视”窗口中添加该实例的名称加上一个点以及其中一个生成的属性的名称,则调试器会识别该属性,并向我显示其值;所以财产就在那里;但它不会显示在“本地”或“自动”下。

是什么原因造成的?我该如何解决?

C# visual-studio 调试 reflection.emit

评论


答:

3赞 Mike Nakis 10/8/2023 #1

事实证明,属性主要是,但不完全是句法糖。

一个类,它包含并似乎实现了该属性,就调用该属性的任何代码而言,但该类并不真正实现该属性,除非它显式定义该属性。get_Foo()set_Foo()FooFoo

因此,当 Visual Studio 调试器尝试决定在“局部变量”或“自动”窗口中为对象显示哪些属性时,它会枚举该对象的属性,如果未定义任何属性,则不会显示任何属性。

因此,这个问题的解决方案是,在代码生成过程中,除了调用定义每个方法外,我们还必须跟踪哪些方法是 getter 和 setter,然后为每个属性执行 a 并为其指定 getter 和 setter。TypeBuilder.DefineMethod()TypeBuilder.DefineProperty()

严格来说,这不是必需的,但从反射的角度来看,生成的类将是完整的,因此它将在调试器中正常运行。

评论

0赞 wenbingeng-MSFT 10/12/2023
你的回答很有帮助,你可以标记它,这样它就可以帮助更多的人
0赞 Mike Nakis 10/12/2023
@wenbingeng-MSFT谢谢。我等了几天,看看其他人是否能想出更好的答案。(因为已经接受的问题会阻止人们添加答案。