如何将匿名类型转换为键值对对象
问题描述:
我试图弄清楚从我的Web服务获取数据的干净方式,即键/值对。如何将匿名类型转换为键值对对象
有没有办法采取这样的查询:
var q = db.Ratings.Select(x => new
{
x.pro,
x.con,
x.otherThoughts,
x.Item.title,
x.score,
x.subject
});
就会返回一个键值对,其中键将以上列出的列,与其对应的价值?
而不是创建一个单独的类?
myDict.Add("pro", q.pro);
myDict.Add("con", q.con);
这是效率不高,创造这样一个类不是非此即彼,尤其是如果我有许多方法:
public class Rating
{
public string pro { get; set; }
public string con { get; set; }
}
我搜索所有打开了包含前两个代码示例样本。
答
我不建议使用您正在查看的'无类型'方法。
我会使用类型化对象,而不是你想创建的。
但是,这里是你的问题的答案。您可以根据需要使用DataTable对象。像这样:
var items = new[]
{
new Item { Id = 1, Name = "test1" },
new Item { Id = 2, Name = "test2" }
};
var dataTable = new DataTable();
var propeties = typeof(Item).GetProperties();
Array.ForEach(propeties, arg => dataTable.Columns.Add(arg.Name, arg.PropertyType));
Array.ForEach(items, item => dataTable.Rows.Add(propeties.Select(arg => arg.GetValue(item, null)).ToArray()));
return dataTable;
应该很容易编写一个反映一个对象并返回正确的'Dictionary'的方法。 另外,你可以看看使用'动态'。但是,这种方法在中等信任环境中并不是那么脆弱,因此如果您要部署到共享托管的网站,请小心。 –
marcind
2011-05-24 02:38:09
你为什么认为选择非描述性字典比返回一个类更清洁* *方法? – 2011-05-24 02:42:30
如果我在一个名为Ajax的Web服务中有30个方法,现在我有30个方法和30个类,愚蠢。 – 2011-05-24 02:44:49