2012-09-26 150 views
2

我已經構建了一個使用Dynamic關鍵字的程序。動態對象在一臺PC上工作,但不在另一臺上

在我的代碼點我這樣做:

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

而這個工作,所以我把它提交給SourceControl。然後我的老闆得到的文件,嘗試運行,但上線if (expando.Attention == NotifyEnums.ALERT)得到一個錯誤,顯然expando.Attention不會在動態對象存在:

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後,我點擊繼續,再次得到錯誤,再次點擊繼續,然後程序繼續若無其事。它從動態對象中讀取正確的值。

+0

如果你在老闆的PC上運行它,而不是在調試器中,會發生什麼? –

+0

@JonSkeet 週末結束後我會試試:P – ProgrammerAtWork

+0

@JonSkeet調試器或者沒有調試器,沒關係。老闆仍然有錯誤。我把我的二進制文件發給了我的老闆PC,他們工作的很好。所以這是在二進制文件中的東西。在VS2010中,取消選中「Debug - > Exceptions」下的CLR異常,可以在Boss PC上停止這種異常。但檢查CLR異常不會導致這種異常發生在我的電腦上。 – ProgrammerAtWork

回答

4

它看起來像你有第一次機會例外打開老闆機器。查看Debug/Exceptions下面的內容,並取消選中Thrown列中的所有內容。 當類不直接實現成員時,expando對象拋出異常是正常的,它使用異常來啓動輔助查找並返回正確的信息。

+0

我的老闆不在這裏atm,所以我會嘗試一下你的建議。你說的話是有道理的,但是如果我檢查列表中的所有內容(在我的電腦上)並運行程序,讀取expando對象時不會有例外。任何想法爲什麼? – ProgrammerAtWork

+0

不知道。選項/調試/常規中有一個名爲「啓用我的代碼」的選項。設置時,另一列顯示在名爲「用戶未處理」的調試/例外中。也許這個專欄可能會影響你是否抓住這些例外。 –

+0

@JoelLucsy是對的。轉到異常對話框並單擊重置全部。 – edokan

相關問題