2012-03-06 56 views
5

我有一些代碼可以與由數據庫調用填充的ExpandoObjects一起使用。總是有些值是空值。當我將對象看作ExpandoObject時,我會看到底層字典中的所有鍵和值(包括空值)。但是,如果我嘗試通過動態引用訪問它們,那麼具有相應空值的任何鍵都不會顯示在該對象的動態視圖中。當我嘗試通過動態引用上的屬性語法訪問它時,我得到一個ArgumentNullException。ExpandoObjects的動態視圖「隱藏」具有空值的屬性

我知道我可以通過直接使用ExpandoObject,添加一堆try catch,將expando映射到一個具體類型等方式來解決這個問題,但是這樣做會破壞在這個動態對象中的目的第一名。如果某些屬性具有空值,則消耗dyanmic對象的代碼將正常工作。是否存在更加簡潔或者簡潔的方式來「取消隱藏」這些具有空值的動態屬性?

以下是一個演示我的「問題」代碼

dynamic dynamicRef = new ExpandoObject(); 
ExpandoObject expandoRef = dynamicRef; 

dynamicRef.SimpleProperty = "SomeString"; 
dynamicRef.NulledProperty = null; 

string someString1 = string.Format("{0}", dynamicRef.SimpleProperty); 

// My bad; this throws because the value is actually null, not because it isn't 
// present. Set a breakppoint and look at the quickwatch on the dynamicRef vs. 
// the expandoRef to see why I let myself be led astray. NulledProperty does not 
// show up in the Dynamic View of the dynamicRef 
string someString2 = string.Format("{0}", dynamicRef.NulledProperty); 
+0

ExpandoObject的可以存儲空值,並將它們拉出來,你確定是什麼導致參數爲null異常嗎? – jbtule 2012-03-06 21:51:08

+1

如果這個鍵存在於'ExpandoObject'中,它將返回它,不管它是否爲'null'。如果它不存在,它將拋出一個'RuntimeBinderException'。它不會拋出'ArgumentNullException',所以你的代碼中必然會有一些錯誤。你能告訴我們拋出的代碼嗎? – svick 2012-03-07 00:32:58

+0

好的,我想我只是被Visual Studio監視窗口所迷惑。該代碼拋出一個ArgumentNullException,因爲該值實際上是空的,而不是因爲該屬性「缺失」。當我在動態引用上設置監視時,它不顯示屬性是否爲空值。如果我讓手錶觀察ExpandoObject對同一對象的引用,它會在底層密鑰列表中顯示屬性名稱。 – 2012-03-07 01:30:12

回答

3

您所遇到的問題是動態運行時的過載調用是撿string .Format(format, params object[] args)而不是預期的string.Format(string format, object arg0)一個簡單的投將切換到的string.Format靜態調用並修復它。

string someString2 = string.Format("{0}", (object)dynamicRef.NulledProperty); 
+0

完美!這照顧了它。 – 2012-03-07 15:01:19