如何将匿名类型转换为键值对对象

问题描述:

我试图弄清楚从我的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; } 
} 

我搜索所有打开了包含前两个代码示例样本。

+0

应该很容易编写一个反映一个对象并返回正确的'Dictionary '的方法。 另外,你可以看看使用'动态'。但是,这种方法在中等信任环境中并不是那么脆弱,因此如果您要部署到共享托管的网站,请小心。 – marcind 2011-05-24 02:38:09

+0

你为什么认为选择非描述性字典比返回一个类更清洁* *方法? – 2011-05-24 02:42:30

+1

如果我在一个名为Ajax的Web服务中有30个方法,现在我有30个方法和30个类,愚蠢。 – 2011-05-24 02:44:49

我不建议使用您正在查看的'无类型'方法。
我会使用类型化对象,而不是你想创建的。

但是,这里是你的问题的答案。您可以根据需要使用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;