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

C# 如何将匿名类型转换为键值对对象,c#,C#,我正试图找到一种从我的web服务中获取数据的干净方法,即键/值对 有没有一种方法可以接受这样的查询: var q = db.Ratings.Select(x => new { x.pro, x.con,

我正试图找到一种从我的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;

我不建议使用您正在研究的“非类型化”方法。
我将使用类型化对象,即您不想创建的对象

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

编写反映对象并返回正确的
字典的方法应该相当容易。或者,您可以研究使用
动态
。然而,并不是说这些方法在中等信任环境中是脆弱的,所以如果要部署到共享托管网站,请小心。为什么您认为选择非描述性字典比返回类更干净?如果我在一个名为Ajax的web服务中有30个方法,现在我有30个方法和30个类,哑巴。我会用30行输入来获得新类的示例——或者更好,自动完成任务;-)第一种方法会丢失静态类型(我认为这通常很糟糕),除非键是好的、真正动态的。如果您确实使用了该类,那么它只是对原始查询的简单修改:
newmytype{con=…}
这里没有同情心。这是一个思维过程,就像我目前正在开发的应用程序一样,乱七八糟。尽管强类型对象完全描述了它们所封装的内容,但我还是被困在一个像candy一样传递数据集的应用程序上。不知道它们是什么,不知道它们从哪里来,收拾残局几乎是不可能的。花额外的几分钟创建一个类,然后感谢你自己。如果您选择您的方法,我祝您好运。编写一个反映对象并返回正确的
字典的方法应该相当容易。或者,您可以研究使用
动态
。然而,并不是说这些方法在中等信任环境中是脆弱的,所以如果要部署到共享托管网站,请小心。为什么您认为选择非描述性字典比返回类更干净?如果我在一个名为Ajax的web服务中有30个方法,现在我有30个方法和30个类,哑巴。我会用30行输入来获得新类的示例——或者更好,自动完成任务;-)第一种方法会丢失静态类型(我认为这通常很糟糕),除非键是好的、真正动态的。如果您确实使用了该类,那么它只是对原始查询的简单修改:
newmytype{con=…}
这里没有同情心。这是一个思维过程,就像我目前正在开发的应用程序一样,乱七八糟。尽管强类型对象完全描述了它们所封装的内容,但我还是被困在一个像candy一样传递数据集的应用程序上。不知道它们是什么,不知道它们从哪里来,收拾残局几乎是不可能的。花额外的几分钟创建一个类,然后感谢你自己。如果你选择你的方法,我祝你好运。