我有一个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()
被列为几种“明确实现的接口(interface)方法”之一。对我而言,不必将其放入动态对象中-我只需要根据键值对的键和值获取具有属性名称和值的对象即可。
更新:好吧,这很尴尬。原来这也是一个XY问题。
我正在尝试通过使用ASP.NET MVC的内置功能,将其呈现为JSON,只需在 Controller 中返回
Json(data)
即可。答案都很好地完成了我第一次问的事情,但是当我将此对象作为data
传递时,我仍然没有得到我想要的东西:// What I get:
[
{ Key: 'firstkey', Value: 'FirstValue' },
{ Key: 'secondKey', Value: 'secondValue' }
]
// What I want:
{ firstKey: 'FirstValue', secondKey: 'secondValue' }
显然,添加了相关属性的
ExpandoObject
并没有将其剪切-在呈现之前将其转换为字典... 最佳答案
ExpandoObject
显式实现IDictionary<string, object>
-因此您需要先将其强制转换为一个:
var kvps = getProps();
dynamic o = new ExpandoObject();
var dict = o as IDictionary<string, object>;
foreach (var kvp in kvps)
{
dict.Add(kvp.Key, kvp.Value);
}
现在,您可以按期望的方式使用
o
:var example = o.YourKey;
有趣的。
为此,您要序列化词典,而不是ExpandoObject。 MVC 3的JSON序列化程序已经使用字典进行了此操作。您所要做的就是将
IEnumerable<KeyValuePair<string, object>>
转换为字典:var kvps = getProps();
var dictionary = kvps.ToDictionary(k => k.Key, v => v.Value);
return Json(dictionary, JsonRequestBehavior.AllowGet); //take out allow get if you don't need it.
无需动力学。
关于c# - 在LINQ查询中将KeyValuePair转换为匿名类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11191280/