2

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

在我的代码中,我这样做:

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

这行得通,所以我将它提交给 SourceControl。然后我的老板得到文件,尝试运行它但在线出错if (expando.Attention == NotifyEnums.ALERT),显然是expando.Attention在动态对象中不存在:

在此处输入图像描述

这让我很困惑,因为我们都针对相同的 .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;
    }
}

那么这是怎么回事,谁能详细说明?

编辑:

但是还有另一件事,在程序崩溃之后,我单击继续,再次出现错误,再次单击继续,然后程序继续运行,就好像什么也没发生一样。它从动态对象中读取正确的值。

4

1 回答 1

4

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

于 2012-09-28T12:51:50.440 回答