2

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;
    }
}

では、何が起こっているのでしょうか。

編集:

しかし、別のこともあります。ProgramCrahsesの後、[Continue]をクリックし、エラーを再度取得し、[Continue]をもう一度クリックすると、何も起こらなかったかのようにプログラムが続行されます。動的オブジェクトから正しい値を読み取ります。

4

1 に答える 1

4

ボスマシンで最初のチャンスの例外がオンになっているようです。Debug / Exceptionsの下を見て、Thrown列のすべてのチェックを外します。クラスがメンバーを直接実装していない場合、expandoオブジェクトが例外をスローするのは通常のことです。例外を使用して、セカンダリルックアップを起動し、正しい情報を返します。

于 2012-09-28T12:51:50.440 に答える