2014-09-25 91 views
2

這是一個ViewModel屬性定義。ExpandoObject屬性未找到

private List<ExpandoObject> productList; 

public List<ExpandoObject> Products { 
    get { 

     return productList; 
    } 

    set { 

     productList = value; 

    } 
} 

在selectedProduct ExpandoObject,我有一個名爲LINENUM一個屬性,它的標準方式設置ExpandoObjects:

product.lineNum = some_integer; 

現在,位於另一個對象中的一個方法裏面,我有這個。 object_passed_in被聲明爲Object,並且productList的成員被傳遞給它。

var selectedProduct = object_passed_in as ExpandoObject 
// I have tried this as "dynamic", too 

當我設置一個斷點並觀看「selectedProduct.lineNum」時,手錶工作得很好 - 它顯示正確的值。然而...

if (selectedProduct.lineNum == some_comparison_value) { 

    // some lines of code 
} 

拋出一個錯誤 - 一個第一次機會異常,告訴我,LINENUM不上ExpandoObject selectedProduct發現了一個屬性。

我可以擊敗ExpandoObject就範通過它投射到一個IDictionary <字符串,對象>類型,然後訪問屬性是這樣的:

int passed_in_lineNum = (int)selectedProduct["lineNum"]; 

但完全失去了使用的ExpandoObject的宗旨!

什麼。上午。我在做。錯誤。這裏???

+0

我可以問你爲什麼使用這樣的構造?使用ExpandoObject看起來像是一種非常令人討厭的代碼味道,也是一種體系結構(顯然,當您與DLR語言進行交互時,這不適用)。 – Machinarius 2014-09-25 21:56:18

+0

公平的問題 - 我正在處理一堆從外部來源加載到程序中的屬性 - 動態的 - 它們可以是用戶希望他們成爲的任何用戶,所以我們不知道它們在編譯時被命名爲什麼,時間。我們既不知道它們的數量,也不知道它們的名稱,所以ExpandoObject似乎是適用於此應用程序的正確選擇。 – 2014-09-25 22:06:29

+0

@Machinarius - 你會採取不同的方法?如果是這樣,我很好奇... – 2014-09-25 22:15:50

回答

1

您是否在工具 - >選項 - >調試 - >常規下取消選中「啓用我的代碼」?因爲這是第一次機會例外,所以DLR極有可能引發並捕獲它(我可以通過「啓用只是我的代碼」來取消選中)。嘗試忽略異常或檢查「啓用我的代碼」並查看它是否有效。

+0

... aaaaaand似乎已經修復它;當然,我完全改變了代碼中對ExpandoObject的引用。 grrrr :) – 2014-09-25 22:12:22