[HttpPost]
public ActionResult Edit(orders neworders)
{
string modifields;
orders oldorders = HDB.orders.Where(c => c.id_order == cmd.id_order).First();
foreach (var field in oldorders)
{
if(field!= neworders.samefield)
{
modifields+=nameoffield ;
}
}
}
问如何比较新记录和旧记录中的字段,如果更改了值,则保存字段名称?
答案 0 :(得分:1)
Equals()方法的一个示例覆盖以比较同一个类的实例
public override bool Equals(object anObject)
{
if (anObject is Order)
{
Order newOrder = (Order)anObject;
if (newOrder.Name.Equals(this.Name)) //add additional comparisons as needed. You could also use a foreach loop here as Tony shows below
{
return true;
}
foreach (var field in typeof(Order).GetFields())
{
if (field.GetValue(this) != field.GetValue(newOrder)) { return false; }
}
foreach (var property in typeof(Order).GetProperties())
{
if (property.GetValue(this, null) != property.GetValue(newOrder, null)) { return false; }
}
}
return false;
}
以下是如何致电您的行动:
[HttpPost] public ActionResult Edit(orders neworder)
{
orders oldorder = HDB.orders.Where(c => c.id_order == cmd.id_order).First();
if(oldorder.Equals(newOrder)
{
//do wome work
}
}
答案 1 :(得分:1)
First()
返回单个对象,因此无法迭代。
在行之间进行读取,您希望迭代对象上的所有字段。在这种情况下,您可以使用反射返回可以迭代的字段列表。
foreach (var field in oldorders.GetType().GetFields())
{
var value = field.GetValue(oldorders);
}
编辑:从您的其他评论中看起来您想要将该对象与另一个对象进行比较,在这种情况下,您最好实现IEquatable<T>
接口。例如。
class Order : IEquatable<Order>
{
// TODO: add properties of an Order
public string foo { get; set; }
public string bar { get; set; }
public bool Equals(Order other)
{
foreach (var field in typeof(Order).GetFields())
{
if (field.GetValue(this) != field.GetValue(other))
{
return false;
}
}
foreach (var property in typeof(Order).GetProperties())
{
if (property.GetValue(this, null) != property.GetValue(other, null))
{
return false;
}
}
return true;
}
}
答案 2 :(得分:0)
我会说你的orders
类没有正确实现IEnumerable
接口。为了以这种方式使用foreach
,您必须实现该接口,并至少考虑支持它所需的所有方法。
答案 3 :(得分:0)
您的订单变量不是可枚举的。 First()方法返回单个对象。删除.First(),你将拥有一个foreach循环可以使用的Enumerable对象