[英]How can I instantiate and add to a class inside a foreach loop in C#
我有要用於記錄錯誤消息的代碼。 我制作了兩個這樣的類來保存消息:
public class HttpStatusErrors
{
public HttpStatusErrors()
{
this.Details = new List<HttpStatusErrorDetails>();
}
public string Header { set; get; }
public IList<HttpStatusErrorDetails> Details { set; get; }
}
public class HttpStatusErrorDetails
{
public HttpStatusErrorDetails()
{
this.Details = new List<string>();
}
public string Header { set; get; }
public IList<string> Details { set; get; }
}
我認為這是執行此操作的好方法,但是我不確定100%會接受任何建議。
我想在第一類中存儲Header
,在我的示例中為“ Validation Messages”。 然后在Detail
對象中,我想存儲另一個Header
,該Header
顯示有錯誤的實體,最后在Details
存儲驗證錯誤。
我很困惑的是我應該如何實例化這些類。 到目前為止,我已經做到了。 我認為這是正確的。 但是如何添加需要添加的詳細信息:
catch (DbEntityValidationException ex)
{
var msg = new HttpStatusErrors();
msg.Header = "Validation Error";
foreach (var eve in ex.EntityValidationErrors)
{
var header = string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
foreach (var ve in eve.ValidationErrors)
{
var detail = string.Format("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
}
}
}.
在“ Details
屬性中實例化集合。 實例化新項目,並將其添加到循環中的集合中:
var msg = new HttpStatusErrors();
msg.Header = "Validation Error";
msg.Details = new List<HttpStatusErrorDetails>();
foreach (var eve in ex.EntityValidationErrors)
{
var detail = new HttpStatusErrorDetails()
detail.Header = String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
detail.Details = new List<string>();
foreach (var ve in eve.ValidationErrors)
{
detail.Details.Add(String.Format("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage));
}
msg.Details.Add(detail);
}
順便說一句,您可以為此使用LINQ:
var msg = new HttpStatusErrors();
msg.Header = "Validation Error";
msg.Details =
ex.EntityValidationErrors
.Select(eve => new HttpStatusErrorDetails {
Header = String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State)
Details = eve.ValidationErrors
.Select(ve => String.Format("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage))
.ToList()
}).ToList();
我也喜歡擴展方法語法:
public static HttpStatusErrors ToHttpStatusErrors(
this DbEntityValidationException ex)
{
return new HttpStatusErrors {
Header = "Validation Error",
Details = ex.EntityValidationErrors
.Select(eve => eve.ToHttpStatusErrorDetails())
.ToList()
};
}
public static HttpStatusErrorDetails ToHttpStatusErrorDetails(
this DbEntityValidationResult eve)
{
return new HttpStatusErrorDetails {
Header = String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State),
Details = eve.ValidationErrors
.Select(ve => ve.ToErrorDescription())
.ToList()
};
}
public static string ToErrorDescription(
this DbValidationError ve)
{
return String.Format("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
}
此類方法的用法如下:
catch (DbEntityValidationException ex)
{
var msg = ex.ToHttpStatusErrors();
}
請嘗試以下操作:
foreach (var eve in ex.EntityValidationErrors)
{
//New Details Entity
var errorDetail = new HttpStatusErrorDetails();
//Fill in Header
errorDetail.Header = string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
//Fill Add a detail for each validation error
foreach (var ve in eve.ValidationErrors)
{
errorDetail.Details.Add(string.Format("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage));
}
//Add Detail to header
msg.Details.Add(errorDetail);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.