动态对象在一台PC上运行,但在另一台PC上运行

时间:2012-09-26 09:26:23

标签: c# .net dynamic

我已经构建了一个使用Dynamic关键字的程序。

在我的代码中的某一点我这样做:

public void OnNext(ExpandoObject value)
{
    dynamic expando = value;
    if (expando.Attention == NotifyEnums.ALERT)
    {
        _needsAttention = true;
    }
}

这样可行,所以我将它提交给SourceControl。然后我的老板获取文件,尝试运行它但在行if (expando.Attention == NotifyEnums.ALERT)上收到错误,显然是expando。动态对象中不存在注意:

enter image description here

这让我很困惑,因为我们都针对相同的.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,再次出现错误,再次单击继续,然后程序继续,好像什么也没发生。它从动态对象中读取正确的值。

1 个答案:

答案 0 :(得分:4)

看起来你在老板机器上有第一次机会异常。在Debug / Exceptions下查看并取消选中Thrown列中的所有内容。 当类没有直接实现成员时,expando对象抛出异常是正常的,它使用异常来触发辅助查找并返回正确的信息。