如何制作包含匿名对象的列表

本文关键字:列表 对象 何制作 包含匿 | 更新日期: 2023-09-27 18:27:41

我创建了以下代码:

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 >);

它检查我的每个实体错误,打印调试消息,创建标题和详细信息列表。

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

如何制作包含匿名对象的列表

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

好吧,一种懒惰的方式是:作为object:

var list = new List<object>();
//...
list.Add(new { Foo = 123, Bar = "abc" });

不过,这并不是很有用。因此,也许问题是"如何制作一个由匿名类型键入的列表";稍微棘手一点-您需要使用一个实例来说服编译器注入T:

var list = Enumerable.Repeat(new { Foo = 123, Bar = "abc" }, 0).ToList();
//...
list.Add(new { Foo = 456, Bar = "def" });

(注意,最上面一行的列表是空的;那个假实例只是编译器的模板)

但同样,这仍然是最好的地方。然后你说"我想回来"-现在那里是真正有问题的地方。基本上,您不能返回类型的。您可以返回object或非泛型IList,但不能作为匿名类型返回,因此对调用者没有任何用处。

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

来自文档:

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

这实际上总结了评论中所说的话。如果您需要从方法返回一些东西,那么它就是类接口的一部分。返回一个神秘的对象的接口对客户端来说不是很清楚和可读,而且很难维护。

这个怎么样:

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

在呼叫者中,你可以这样做:

int fooSum = GetAnonymousList().Sum(item => item.Foo);
IEnumerable<string> bars = GetAnonymousList().Select(item => (string)item.Bar);

尽管这在实践中可能与返回List<object>,然后使用Tomas Petricek描述的技巧将其投射回原始匿名类型一样糟糕:

http://tomasp.net/blog/cannot-return-anonymous-type-from-method.aspx

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

你可以在这个上做点什么

  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" }

您还可以创建一个匿名对象数组,并调用ToList()方法

到目前为止,所有的answe似乎都忽略了您实际想要做的是从看起来很像wep.api方法的东西返回JSON

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

相反,您必须为该方法使用现有的重载之一。也许你真的可以把它作为一个预格式化的字符串返回,或者你可以试着用ModelStateDictionary来使用重载(不确定它是否有效,或者有多困难)?

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