我有一些代码可以与由数据库调用填充的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