我有一个IEnumerable<KeyValuePair<string,string>>,希望得到一个匿名对象,其中键作为属性名,值作为属性值。我尝试了各种选择表达式(甚至没有编译...)和使用ExpandoObject的方法(见下文),但都没有成功。有没有好的方法可以做到这一点?如果可能的话,我想避免额外的显式迭代集合(即用某种LINQ语句完成所有操作)。以下是我目前尝试过的方法,希望它也能澄清我的意图:
这在编译时没问题,但运行时出现一个YSOD,并显示“System.Dynamic.ExpandoObject”不包含“Add”的定义——我猜它在编译时工作是因为
显然,添加了相关属性的
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()
方法。奇怪的是,在ExpandoObject的MSDN文档页面上,.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
并不能满足需求 - 在呈现之前被转换为字典...