C# 如何创建包含匿名对象的列表?

C# 如何创建包含匿名对象的列表?,c#,C#,我创建了以下代码: var header = "Entity Validation Error"; var detail = < I want to have a list that contains the title and errors list here> foreach (var eve in ex.EntityValidationErrors) { var title = string.Format("Entity of type \"{0}\" in state

我创建了以下代码:

var header = "Entity Validation Error";
var detail = < I want to have a list that contains the title and errors list here>
foreach (var eve in ex.EntityValidationErrors)
{
    var title = string.Format("Entity of type \"{0}\" in state \"{1}\"
                has the following validation errors:",
        eve.Entry.Entity.GetType().Name, eve.Entry.State);
    System.Diagnostics.Debug.WriteLine(title);
    var errors = new List<string>();
    foreach (var ve in eve.ValidationErrors)
    {
        var error = string.Format("- Property: \"{0}\", Error: \"{1}\"",
            ve.PropertyName, ve.ErrorMessage);
        errors.Add(error);
        System.Diagnostics.Debug.WriteLine(error);
    }
}
return Request.CreateErrorResponse(HttpStatusCode.Conflict, 
         < I want to return the header and detail as an anonymous object >);
var header=“实体验证错误”;
var detail=<我想要一个包含标题和错误列表的列表>
foreach(ex.EntityValidationErrors中的var eve)
{
var title=string.Format(“状态为“{1}”的类型为“{0}”的实体”
存在以下验证错误:“,
eve.Entry.Entity.GetType().Name,eve.Entry.State);
系统.诊断.调试.写线(标题);
var errors=新列表();
foreach(eve.ValidationErrors中的变量ve)
{
var error=string.Format(“-Property:\“{0}\”,错误:\“{1}\”,
ve.PropertyName,ve.ErrorMessage);
错误。添加(错误);
系统.诊断.调试.写入线(错误);
}
}
返回请求.CreateErrorResponse(HttpStatusCode.Conflict,
<我想以匿名对象的形式返回标题和详细信息>);
它检查我的每个实体错误,打印调试消息,创建标题和详细信息列表


如何将变量title和errors作为匿名对象,并将其放入列表中,以便返回它们?

您可以这样做

  public List<T> CreateList<T>(T itemOftype)
  {
     List<T> newList = new List<T>();
     return newList;
  } 

   var error = new { Header= "AVBC", Details = "Details" };
   var errorList = CreateList(error );

   errorList.Add(new { Header= "AVBC_BCGBD", Details = "Details_SBNJHJH" }
public List CreateList(T itemOftype)
{
List newList=新列表();
返回newList;
} 
var error=new{Header=“AVBC”,Details=“Details”};
var errorList=CreateList(错误);
添加(新的{Header=“AVBC\u BCGBD”,Details=“Details\u SBNJHJH”}
您还可以创建一个annonymous对象数组,并从以下位置调用
ToList()
method

不能声明字段、属性、事件或返回类型 将方法定义为具有匿名类型。类似地,您不能声明 方法、属性、构造函数或索引器的形式参数,如 具有匿名类型。传递匿名类型或集合 包含匿名类型的,作为方法的参数,您可以 将参数声明为类型对象。但是,这样做会使 强类型的用途。如果必须存储或传递查询结果 在方法边界之外,考虑使用普通命名结构 或类而不是匿名类型

这实际上总结了注释中所说的内容。如果您需要从方法返回某些内容,则它是类接口的一部分。返回神秘对象的接口对其客户端来说不是非常清楚和可读,并且很难维护

如何在C#中创建包含匿名对象的列表

一种懒惰的方法是:作为
对象

var list = new List<object>();
//...
list.Add(new { Foo = 123, Bar = "abc" });
(请注意,顶行中的列表为空;该伪实例只是编译器的模板)

但是,这仍然是最好保持本地的。然后你说“我想返回”-现在这是它真正有问题的地方。基本上,你不能返回它的类型。你可以返回
对象
,或者非泛型的
IList
-但不能作为匿名类型,因此对调用方没有任何用处

基本上,在这一点上,我会说:“不要”。相反,创建一个常规类型,并将其作为该类型公开。匿名类型在创建它们的方法之外不能很好地工作(有一些小的警告,如数据绑定和序列化,这是可以的)。

这样如何:

public List<dynamic> GetAnonymousList()
{
   var list = new List<dynamic>()
    {
       new { Foo = 123, Bar = "abc" },
       new { Foo = 456, Bar = "def" }
    };

    return list;
}
public List GetAnonymousList()
{
var list=新列表()
{
新的{Foo=123,Bar=“abc”},
新的{Foo=456,Bar=“def”}
};
退货清单;
}
在调用者中,您可以执行以下操作:

int fooSum = GetAnonymousList().Sum(item => item.Foo);
IEnumerable<string> bars = GetAnonymousList().Select(item => (string)item.Bar);
int fooSum=GetAnonymousList().Sum(item=>item.Foo);
IEnumerable Bar=GetAnonymousList().Select(item=>(string)item.Bar);
虽然这在实践中可能与返回
列表
,然后使用Tomas Petricek描述的技巧将其转换回原始匿名类型一样糟糕:


正如其他答案所说:如果您需要返回它,那么最好为项目定义一个合适的类型/接口。

到目前为止,所有的Answe似乎都忽略了您真正想要做的是从看起来非常像
wep.api
方法的东西返回
JSON

但是根据
Request.CreateErrorResponse
方法的重载列表(请参阅),似乎无法简单地从代码中返回匿名类型

相反,您必须为该方法使用一个现有重载。也许您可以实际将其作为预格式化字符串返回,或者您可以尝试将重载与
ModelStateDictionary
一起使用(不确定它是否有效或有多困难)


但是,由于没有重载获取
对象(也没有与
Request.CreateResponse
相反的通用重载),您无法完全按照自己的意愿执行操作。

那么,“
返回<我想以匿名对象的形式返回标题和详细信息>
”这说明了一个基本问题;根据定义,返回匿名对象是不可能的,除非作为
对象
,这对任何调用方都不是很有用。如果要返回它,为什么要匿名?我的代码中还有其他地方返回匿名对象。该对象被发送到web前端,然后使用jsond阅读内容。我同意Marc的观点,只需创建一个简单的类并将其添加到列表中。它的定义会很好,在维护时会更清晰。Melina,显示返回匿名对象的代码。是否要将它们转换为Json?我添加了最后一行。该代码将在将其发送回web fr之前将其内部的内容转换为Jsonont end。它可以被调用方使用(某种程度上)-从TomasP@MikeGoodwin是的,臭名昭著的“示例转换”-坦率地说,这是非常脆弱的-没有很好的用例用于此。如果调用方(或一些下游代码)希望稍后转换它们,那么它一开始就不应该是匿名的。正如我在回答中指出的,我希望
int fooSum = GetAnonymousList().Sum(item => item.Foo);
IEnumerable<string> bars = GetAnonymousList().Select(item => (string)item.Bar);