我有一个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/

10-10 18:45