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

C# 为什么';动态';ExpandoObject抛出RuntimeBinderException,即使它包含属性的定义?,c#,.net,exception,C#,.net,Exception,使用以下示例代码:(VS 2013,更新3) 调试此代码和“在异常发生时中断”时,在VS中签入“抛出”,然后尝试访问现有属性“测试”时抛出一个RuntimeBinderException: System.Dynamic.ExpandooObject'不包含“测试”的定义 注意:转到下一行时,变量j被正确设置为10 Q1:当Test属性确实存在并且持有由事实变量j成功设置该值证明的值10时,为什么会抛出异常?当我尝试使用一个真正不存在的属性名(如Test2)时,会发生完全相同的异常,不同的

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

调试此代码和“在异常发生时中断”时,在VS中签入“抛出”,然后尝试访问现有属性“测试”时抛出一个
RuntimeBinderException

System.Dynamic.ExpandooObject'不包含“测试”的定义

注意:转到下一行时,变量j被正确设置为10



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

抛出一个完全错误且具有误导性的异常,然后在内部处理它是没有意义的,此外,当异常发生时,它会呈现VS'Break:“抛出”选项特性对于使用动态对象的代码实际上是不可用的

问题2:是的,我知道当出现异常时,取消选中“中断”选项可以隐藏此问题:“抛出”选项。 但是,如果开发人员使用动态对象,并试图在其代码中查找与动态对象完全无关的异常,则此问题会使“异常发生时中断:'抛出'选项不可用,因为调试器将停止数千条正确的属性访问语句。有什么解决办法吗

我错过了什么

提前谢谢


*编辑* 此编辑位于正确答案之后

Damir在他的回答中问道:“为什么我在你的VS选项中禁用了Enable Just My Code?”。。。有几天,我一直被这个问题困扰着,并且体验到,尽管我显式地检查了justmycode选项,但它在VSclose/start会话之间并不存在。最后我发现了原因

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

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


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

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

不应该发生。查看ExpandoObject的源代码:。Ricardo,你想要视频作为证明,还是相信我不是PhotoShop编辑的图片:-)在.NET Framework中有几十个异常被抛出、捕获并正确处理。为什么不简单地禁用该特定异常的“抛出时中断”选项,并对所有其他异常保持启用状态。但我需要取消选中“仅启用我的代码”(在“选项、调试、常规”中)以查看异常,参见Damir Arh的“答案”。@leppie堆栈跟踪只有一个“帧”,它看起来像这样:
“在Microsoft.CSharp.RuntimeBinder.RuntimeBinderController.submitror(CError pError)”
,第一次显示此弹出窗口RuntimeBinderException时,他可以在抛出此异常类型时从Break中删除复选标记。然后他将不再看到
RuntimeBinderException
实例。如果他愿意,他仍然可以在自己的代码和BCL代码中看到其他异常(甚至处理过的异常)。谢谢Damir。这绝对是一个解决办法,我错过了。这不是一个实际的问题(我的意思是说:谁在乎?),但仍然是:为什么有人在地球上抛出并捕获自己的异常“System.Dynamic.ExpandooObject”不包含“Test”的定义,而它肯定包含…?@g.pickardou可能是因为
Dynamic
可以通过多种方式找到成员。也许(只是猜测)它首先尝试使用失败并抛出的反射查找
Test
属性,捕获该异常,然后继续搜索以查看该属性是否以其他方式可用。@hvd在正常使用场景下抛出数千个异常是个坏主意。没有办法解释和解释它。在这种情况下,在您的解释中:通过反射,我们始终可以获取存在的属性,或者在尝试访问不存在的属性之前获取特定属性是否存在@g、 pickardou我不知道缓存的确切内容,但我知道缓存正在进行,所以无论如何不会有成千上万的异常。
dynamic demo = new ExpandoObject();
demo.Test = 10;
var j = demo.Test; // throws exception