编程语言
首页 > 编程语言> > c# – ExpandoObjects的动态视图“隐藏”具有空值的属性

c# – ExpandoObjects的动态视图“隐藏”具有空值的属性

作者:互联网

我有一些代码适用于由数据库调用填充的ExpandoObjects.总是有些值是空值.当我将对象看作ExpandoObject时,我会看到底层字典中的所有键和值(包括空值).但是,如果我尝试通过动态引用访问它们,则任何具有相应空值的键都不会显示在对象的动态视图中.当我尝试通过动态引用上的属性语法访问它时,我得到一个ArgumentNullException.

我知道我可以通过直接使用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);

解决方法:

您遇到的问题是动态运行时重载调用是选择字符串.Format(format,params object [] args)而不是预期的string.Format(字符串格式,对象arg0),简单的转换将切换到静态调用string.Format并修复它.

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

标签:c,dynamic,expandoobject
来源: https://codeday.me/bug/20190630/1334739.html