我已经构建了一个使用Dynamic关键字的程序。
在我的代码中的某一点我这样做:
public void OnNext(ExpandoObject value)
{
dynamic expando = value;
if (expando.Attention == NotifyEnums.ALERT)
{
_needsAttention = true;
}
}
这样可行,所以我将它提交给SourceControl。然后我的老板获取文件,尝试运行它但在行if (expando.Attention == NotifyEnums.ALERT)
上收到错误,显然是expando。动态对象中不存在注意:
这让我很困惑,因为我们都针对相同的.NET版本:.NET Framework 4 Platform Update 1 KB2478063
而且我知道代码中设置的值。
所以我在读取动态值之前设置断点,然后打开立即窗口。
expando.Attention // Gives an exception on boss computer, works on my computer
但请看以下内容:
(((IDictionary<String, object>)expando).ContainsKey("Attention"))
true // Returns "True" on boss computer and on my computer, WTF!
所以我尝试以下方法:
(NotifyEnums)(((IDictionary<String, Object>)expando)["Attention"])
ALERT // Returns alert on boss computer
总结一下:
public void OnNext(ExpandoObject value)
{
dynamic expando = value;
if (expando.Attention == NotifyEnums.ALERT)
// CRASHES on boss pc, works on my pc
// Error says Attention does not exist.
{
_needsAttention = true;
}
}
和
public void OnNext(ExpandoObject value)
{
dynamic expando = value;
if ((NotifyEnums)(((IDictionary<String, Object>)expando)["Attention"]) == NotifyEnums.ALERT)
// WORKS on BOSS PC (wtf?) and works on my pc.
{
_needsAttention = true;
}
}
那么发生了什么,有人可以详细说明吗?
修改
但还有另一件事,在程序Crahses之后,我单击Continue,再次出现错误,再次单击继续,然后程序继续,好像什么也没发生。它从动态对象中读取正确的值。
答案 0 :(得分:4)
看起来你在老板机器上有第一次机会异常。在Debug / Exceptions下查看并取消选中Thrown列中的所有内容。 当类没有直接实现成员时,expando对象抛出异常是正常的,它使用异常来触发辅助查找并返回正确的信息。