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);
}
Run Code Online (Sandbox Code Playgroud)
这在编译时是可以的,但是在运行时我得到一个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' }
Run Code Online (Sandbox Code Playgroud)
显然,ExpandoObject添加了相关属性并没有削减它 - 它在渲染之前被转换为字典...
您需要使用ExpandoObject作为IDictionary<string, object>在填充它:
var kvps = getProps(); // returns IEnumerable<KeyValuePair<string,string>>
IDictionary<string, object> o = new ExpandoObject();
foreach (var kvp in kvps)
{
// Or use Add(kvp.Key, kvp.Value), if you want
o[kvp.Key] = kvp.Value;
}
dynamic d = o;
// Now you can use the properties
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
现在您可以o按预期使用:
var example = o.YourKey;
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 ASP.NET MVC 的内置功能将其呈现为 JSON,只需在我的控制器中返回 Json(data)。
有趣的。
为此,您需要序列化一个字典,而不是一个 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.
Run Code Online (Sandbox Code Playgroud)
不需要动态。
| 归档时间: |
|
| 查看次数: |
2985 次 |
| 最近记录: |