c# – 为什么’dynamic’ExpandoObject会引发RuntimeBinderException,即使它包含属性的定义?

前端之家收集整理的这篇文章主要介绍了c# – 为什么’dynamic’ExpandoObject会引发RuntimeBinderException,即使它包含属性的定义?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用以下示例代码:(VS 2013,更新3)
dynamic demo = new ExpandoObject();
demo.Test = 10;
var j = demo.Test; // throws exception

当调试此代码和“异常时断开:”在VS中检查“Thrown”,然后尝试访问现有属性“Test”将抛出一个RuntimeBinderException:

System.Dynamic.ExpandoObject’ does not contain a definition for ‘Test’

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

Q1:为什么抛出异常,当Test属性明确存在并保存由事实变量j证明的值10成功设置此值时?当我尝试使用一个非常现有的属性名称(如Test2)时,完全相同的异常发生,区别在于代码真的跳出了一个非处理异常的块…

抛出一个完全错误和误导的异常,然后在内部处理它是没有意义的,除了它使VS’Break当一个例外是:’Thrown’选项功能几乎不能用于代码什么使用动态对象.

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

错过了我的东西?

提前致谢.

*编辑*
这个编辑是在正确的答案之后.

Damir在回答中问道:“为什么在VS选项中禁用启用我的代码?”那么这里是答案…我被bug了几天,并经历过,尽管我明确地检查“我的代码”选项,它以某种方式在VS关闭/启动会话之间不会持续.最后我发现为什么…

解决方法

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

现在,您将在“例外”对话框中获得一个额外的选项,只会破坏您在代码中未处理的异常:

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

猜你在找的C#相关文章