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