为什么'动态'ExpandoObject会抛出RuntimeBinderException,即使它包含属性的定义?

时间:2014-12-02 11:32:22

标签: c# .net exception

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

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

调试此代码时,'异常时中断:'在VS中检查'Thrown''然后尝试访问现有属性'Test'会抛出{ {1}}:

  

System.Dynamic.ExpandoObject'不包含'Test'的定义

注意:单步转到下一行,变量j正确设置为10.

enter image description here


enter image description here


Q1:为什么抛出异常,当Test属性肯定存在并保持值10时,事实变量j成功设置了这个值?当我尝试使用一个非常不存在的属性名称(如Test2)时会发生完全相同的异常,但不同之处在于代码确实跳出了具有非处理异常的块...

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

Q2:是的我知道取消选中可以隐藏此问题'当异常为:'Thrown'选项时中断。 然而,假设开发人员使用动态对象并试图在她/他的代码中查找与动态对象完全无关的异常,这不是一个选项,这个问题使得“当异常是:'抛出'选项无法使用,因为然后调试器将停止数千个正确的属性访问语句。有没有解决方法?

错过了什么?

提前致谢。


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

Damir在回答中问道:“为什么我的VS选项中禁用了启用我的代码?”好吧,这就是答案......我对此进行了几天的监视,并且经历过,尽管我明确地检查了“我的代码”选项,但它在VS关闭/启动会话之间不会持续存在。最后我发现了为什么......

enter image description here

2 个答案:

答案 0 :(得分:7)

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

enter image description here

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

enter image description here

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

答案 1 :(得分:0)

我通过使用“ Jeppe Stig Nielsen”的评论解决了这个问题。只需在抛出此异常类型时取消选中“中断”,调试器将不再阻止代码运行。