C# ExpandoObjects的动态视图“;生皮;具有空值的属性

C# ExpandoObjects的动态视图“;生皮;具有空值的属性,c#,dynamic,expandoobject,C#,Dynamic,Expandoobject,我有一些代码可以处理由数据库调用填充的ExpandoObjects。某些值总是为空。当我将对象视为ExpandooObject时,我会看到底层字典中的所有键和值(包括空值)。但是,如果我试图通过动态引用访问它们,则具有相应null值的任何键都不会显示在对象的动态视图中。当我试图通过动态引用上的属性语法访问ArgumentNullException时,我得到一个ArgumentNullException 我知道我可以通过直接使用ExpandoObject、添加一堆try-catch、将expand

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

我知道我可以通过直接使用ExpandoObject、添加一堆try-catch、将expando映射到具体类型等方法来解决这个问题,但这样做首先会破坏拥有这个动态对象的目的。如果某些属性具有空值,则使用动态对象的代码可以正常工作。有没有一种更有效或简洁的方法来“取消隐藏”这些具有空值的动态属性

下面的代码演示了我的“问题”


您遇到的问题是,动态运行时重载调用正在选择
string.Format(Format,params object[]args)
而不是预期的
string.Format(string Format,object arg0)
一个简单转换将切换到
string.Format
的静态调用并修复它

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

ExpandoObject可以存储空值并将其取出,您确定是什么导致参数空异常吗?如果
ExpandoObject
中存在该键,它将返回它是否为
null
。如果它不存在,它将抛出一个
RuntimeBinderException
。它不会抛出
ArgumentNullException
,因此您的代码中一定有错误。你能给我们看看抛出的代码吗?好吧,我想我只是被Visual Studio的监视窗口愚弄了。代码引发ArgumentNullException是因为值实际上为null,而不是因为属性“缺失”。当我在动态引用上设置一个watch时,如果它有空值,它不会显示属性。如果我把一块手表放在同一个对象的ExpandooObject引用上,它会在基础键列表中显示属性名。太好了!这就解决了。
string someString2 = string.Format("{0}", (object)dynamicRef.NulledProperty);