我有一些代碼可以與由數據庫調用填充的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);
ExpandoObject的可以存儲空值,並將它們拉出來,你確定是什麼導致參數爲null異常嗎? – jbtule 2012-03-06 21:51:08
如果這個鍵存在於'ExpandoObject'中,它將返回它,不管它是否爲'null'。如果它不存在,它將拋出一個'RuntimeBinderException'。它不會拋出'ArgumentNullException',所以你的代碼中必然會有一些錯誤。你能告訴我們拋出的代碼嗎? – svick 2012-03-07 00:32:58
好的,我想我只是被Visual Studio監視窗口所迷惑。該代碼拋出一個ArgumentNullException,因爲該值實際上是空的,而不是因爲該屬性「缺失」。當我在動態引用上設置監視時,它不顯示屬性是否爲空值。如果我讓手錶觀察ExpandoObject對同一對象的引用,它會在底層密鑰列表中顯示屬性名稱。 – 2012-03-07 01:30:12