2

我创建了以下代码:

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

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

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

4

5 回答 5

6

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

好吧,一种懒惰的方式是: as 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" });

(请注意,顶行中的列表是空的;该假实例只是编译器的模板)

但同样,这仍然最好保留在本地。然后你说“我想回来”——现在真的有问题了。基本上,你不能返回它typed。您可以 returnobject或非泛型IList- 但不能作为匿名类型,因此对调用者没有任何用处。

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

于 2013-08-15T09:31:08.093 回答
1

这个怎么样:

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

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

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

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

于 2013-08-15T10:00:50.003 回答
1

文档中:

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

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

于 2013-08-15T09:30:37.370 回答
0

你可以这样做

  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()方法

于 2013-08-15T09:28:17.770 回答
0

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

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

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

但是由于没有重载object(也没有通用重载,而不是Request.CreateResponse),所以你不能完全按照你的意愿去做。

于 2013-08-15T10:04:23.393 回答