我有一个返回List<IDictionary<string,object>>
的方法。
使用ExpandoObject
创建字典的对象,然后使用foreach循环将其添加到列表中。以下是此类对象的示例:
var dataItem = new ExpandoObject() as IDictionary<string, object>;
dataItem["String Property 1"] = "String Value 1";
dataItem["String Property 2"] = "String Value 2";
dataItem["DateTime Property 1"] = "DateTime Value 1";
dataItem["DateTime Property 2"] = "DateTime Value 2";
从该方法返回的内容中,我需要选择&#34; DateTime属性1和#34;的不同值,但仅限于日期部分。所以,我试图做以下事情:
var unique = GetData().Select(s => s["DateTime Property 1"].ToShortDateString()).Distinct();
但它说没有ToShortDateString()
这样的方法:
的IEnumerable&#39;不包含的定义 &#39; ToShortDateString&#39;没有扩展方法&#39; ToShortDateString&#39; 接受类型&#39; IEnumerable&#39;的第一个参数。可能 找到。
为属性分配object
值时,为什么词典中的DateTime
未自动转换为DateTime
?当我在任何地方使用dynamic
代替object
时,一切正常。
使用object
时如何使其正常工作?
答案 0 :(得分:1)
您的方法返回List<IDictionary<string,object>>
,因此当您访问Dictionary
中的项目时,编译器会将其视为object
,因此会检测到没有方法{{1在它上面定义。
如果您的方法返回ToShortDateString
并且您以List<dynamic>
方式访问元素,则编译器将不会检查dynamic
是否存在,因此您将不会收到任何错误。< / p>
如果您知道 ToShortDateString
是s["DateTime Property 1"]
,那么您可以简单地投出
DateTime
或者,您可以调用((DateTime)s["DateTime Property 1"]).ToShortDateString();
然后解析结果
ToString