gpt4 book ai didi

c# - 为什么 'dynamic' ExpandoObject 抛出 RuntimeBinderException,即使它包含属性的定义?

转载 作者:可可西里 更新时间:2023-11-01 08:26:55 27 4
gpt4 key购买 nike

使用以下示例代码:(VS 2013,更新 3)

dynamic demo = new ExpandoObject();
demo.Test = 10;
var j = demo.Test; // throws exception

调试此代码时,在 VS 中检查“当异常为:‘抛出’时中断”,然后尝试访问现有属性“测试”抛出 RuntimeBinderException:

System.Dynamic.ExpandoObject' does not contain a definition for 'Test'

注意:跳到下一行,变量 j 已正确设置为 10。

enter image description here


enter image description here


Q1:当Test属性肯定存在且值为10时,事实变量j证明成功设置该值,为什么会抛出异常?当我尝试使用一个真正不存在的属性名称(如 Test2)时,会发生完全相同的异常,不同之处在于代码确实会跳出带有未处理异常的 block ...

抛出一个完全错误和误导性的异常,然后在内部处理它只是没有意义,除了它呈现 VS 'Break when exception is: 'Thrown' 选项功能对于使用动态对象的代码实际上不可用。

问题 2:是的,我知道这个问题可以通过取消选中“异常时中断:‘抛出’”选项来隐藏。然而,如果开发人员使用动态对象并尝试在她/他的代码中查找与动态对象完全无关的异常,则这不是一个选项,这个问题使得“异常时中断:”抛出“选项不可用,因为然后调试器将停止数以千计的正确属性访问语句。有什么解决方法吗?

我错过了什么?

提前致谢。


* 编辑 *此编辑是在正确答案之后。

Damir 在他的回答中问道:“为什么我在您的 VS 选项中禁用了 Enable Just My Code?”好吧,这就是答案……我被这个问题困扰了几天,尽管我明确检查了“仅我的代码”选项,但它在 VS 关闭/启动 session 之间不会以某种方式持续存在。终于知道为什么了……

enter image description here

最佳答案

为什么您在 VS 选项中禁用了仅启用我的代码

enter image description here

现在您将在“异常”对话框中获得一个附加选项,以仅在您未在代码中处理的异常时中断:

enter image description here

如果你像这样配置 VS,当抛出这些内部处理的异常时,调试器将不会再中断。

关于c# - 为什么 'dynamic' ExpandoObject 抛出 RuntimeBinderException,即使它包含属性的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27248375/

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