2012-03-06 55 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