如何制作包含匿名对象的列表
本文关键字:列表 对象 何制作 包含匿 | 更新日期: 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
相反的通用重载),您无法完全按照自己的意愿进行操作。