【发布时间】:2012-06-26 19:45:36
【问题描述】:
我有一个IEnumerable<KeyValuePair<string,string>>,理想情况下,我想要一个匿名对象,其中键作为属性名,值作为属性值。
我尝试了各种选择表达式(甚至都没有编译...)和使用ExpandoObject 的方法(见下文),但没有成功。有没有好的方法来做到这一点?如果可能的话,我想避免对集合进行额外的显式迭代(即使用某种 LINQ 语句完成所有操作)。
这是我迄今为止尝试过的。我希望它也能阐明我想要做什么:
var kvps = getProps(); // returns IEnumerable<KeyValuePair<string,string>>
dynamic o = new ExpandoObject();
foreach (var kvp in kvps)
{
o.Add(kvp);
}
这在编译时没问题,但在运行时我得到一个 YSOD 声明 'System.Dynamic.ExpandoObject' 不包含 'Add' 的定义 - 我猜它在编译时有效时间因为o 是动态的,所以编译器无法知道自实例化以来是否已将方法.Add() 添加到其中。奇怪的是,MSDN documenation page for ExpandoObject .Add() 被列为几个“显式实现的接口方法”之一。
我没有必要把它变成一个动态对象——我只需要根据键值对的键和值来获取具有属性名称和值的东西。
更新:嗯,这很尴尬。原来这也是一个 XY 问题。
我正在尝试使用 ASP.NET MVC 的内置功能将其呈现为 JSON,只需在我的控制器中返回 Json(data)。答案都很好地完成了我第一次问的问题,但是当我将这个对象作为data 传递时,我仍然没有得到我想要的:
// What I get:
[
{ Key: 'firstkey', Value: 'FirstValue' },
{ Key: 'secondKey', Value: 'secondValue' }
]
// What I want:
{ firstKey: 'FirstValue', secondKey: 'secondValue' }
显然,添加了相关属性的 ExpandoObject 并没有删减它 - 它在渲染之前被强制转换为字典...
【问题讨论】:
-
是的,我见过this question。那真是一个XY-problem,在没有帮助我的情况下解决了。