我有方法更新类的属性,然后使用Web服务更新数据库中的对象。我想通过拉动新对象并将其与内存中的对象进行比较来验证更新是否成功。确定两个类中的所有属性是否相等
是否需要比较每个属性,或者这将决定它们是否具有相同的所有属性值?
var areEqual = objectThatHasChanges.Equals(objectSavedToDatabase);
我有方法更新类的属性,然后使用Web服务更新数据库中的对象。我想通过拉动新对象并将其与内存中的对象进行比较来验证更新是否成功。确定两个类中的所有属性是否相等
是否需要比较每个属性,或者这将决定它们是否具有相同的所有属性值?
var areEqual = objectThatHasChanges.Equals(objectSavedToDatabase);
您需要比较每个属性。如果这些是两个参考型对象equals方法将只使用默认等于执行将检查对象是同一实例: https://msdn.microsoft.com/en-us/library/bsc2ak47(v=vs.110).aspx
如果当前实例是引用类型,的Equals(Object)方法 测试引用相等,并且调用Equals(Object)方法 相当于调用了ReferenceEquals方法。参考 相等意味着被比较的对象变量指的是同一个对象的 。以下示例说明了这种 的比较结果。它定义了一个Person类,它是一个引用类型, 并调用Person类构造函数来实例化具有相同值的两个新Person Person1a和Person2对象,person1a和person2。它也 将person1a分配给另一个对象变量person1b。由于示例中的输出 显示,person1a和person1b相等,因为它们 引用相同的对象。然而,person1a和person2并不是 ,尽管它们具有相同的值。
您应该重载“等于”的方法,写你自己的哪个比较每个或钥匙性质(如最后修改日期,修改等),或者你应该写这将需要这两个对象的方法和比较他们。
如果你在不同的对象中有很多字段,你可以编写通用的方法,它使用反射遍历对象中的所有属性,并与其他对象进行比较。当然,首先检查两个对象是否属于同一类型。
如果你真的想检查是否更新成功然后做这样的东西:
string query = @"UPDATE [Entities] SET [Value] = [Value] + 1";
// SQL initialization
return (sqlCommand.ExecuteNonQuery() > 0);
ExecuteNonQuery
返回受影响的\插入的行数。因此,积极的结果意味着更新成功。
如果由于某种原因,想从服务器获取实体更新后,然后用下面的办法:
string query = @"UPDATE [Entities] SET [Value] = [Value] + 1;
SELECT * FROM [Entities] WHERE [Id] = SCOPE_IDENTITY()"
// SQL initialization
var reader = sqlCommand.ExecuteReader();
while (reader.Read())
{
// Object initialization
}
这些方法都是在便利性和性能方面更好。
如果属性名相同,这或多或少是微不足道的:
private static bool IsEqual(Model1 model, Model2 model2)
{
long changes = 0;
foreach (var pi in typeof(Model1).GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
var secondModelPi = typeof(Model2).GetProperty(pi.Name, BindingFlags.Instance | BindingFlags.Public);
if (secondModelPi != null)
{
if (!pi.GetValue(model).Equals(secondModelPi.GetValue(model2)))
{
changes++;
}
}
}
return changes == 0;
}
你要比较的类或对象?它听起来像你正在比较两个对象 – 2015-05-29 11:16:24
[Object.Equals文档](https://msdn.microsoft.com/en-us/library/bsc2ak47%28v=vs.110%29.aspx),它的确是你的决定多少你需要比较以决定什么是足够的。你确定你需要这样做吗?这听起来像它可能是非常昂贵的 – Sayse
对象是实体,我想只是通过每个属性,并比较每一个,但如果我可以做到一条线,它做同样的事情,那么为什么不。 –