确定两个类中的所有属性是否相等

时间:2015-05-29 11:15:02

标签: c#

我有更新类属性的方法,然后使用Web服务更新数据库中的该对象。我想通过拉动新对象并将其与内存中的对象进行比较来验证更新是否成功。

我是否需要比较每个属性,或者这将确定它们是否具有所有属性的相同值?

var areEqual = objectThatHasChanges.Equals(objectSavedToDatabase);

4 个答案:

答案 0 :(得分:3)

您需要比较每个属性。如果这是两个引用类型对象,则equals方法将使用默认的相等实现,它将检查对象是否是相同的实例: https://msdn.microsoft.com/en-us/library/bsc2ak47(v=vs.110).aspx

  

如果当前实例是引用类型,则为Equals(Object)方法   测试参考相等性,并调用Equals(Object)方法   相当于对ReferenceEquals方法的调用。参考   等式意味着被比较的对象变量是指   同一个对象。以下示例说明了此类结果   一个对比。它定义了一个Person类,它是一个引用类型,   并调用Person类构造函数来实例化两个新Person   对象,person1a和person2,它们具有相同的值。它也是   将person1a分配给另一个对象变量person1b。作为输出   从示例中可以看出,person1a和person1b是相同的,因为它们   引用相同的对象。但是,person1a和person2不是   相等,虽然它们具有相同的价值。

您应该重载“Equals”方法并编写自己的方法来比较每个或关键属性(如最后修改日期,修订版等等),或者您应该编写一个方法来获取这两个对象并进行比较。 / p>

如果在不同对象中有很多字段,则可以编写泛型方法,该方法使用反射迭代对象中的所有属性并与另一个进行比较。当然,首先检查两个对象是否属于同一类型。

答案 1 :(得分:1)

如果你真的想检查更新是否成功,那么就这样做:

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
}

这些方式在方便性和性能方面更胜一筹。

答案 2 :(得分:1)

如果属性名称相同,则这或多或少是微不足道的:

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

答案 3 :(得分:0)

要阐明@zaitsman的答案,如果您想将此重复用于多种不同类型,则需要使用通用类型。我还将该类转换为扩展方法,因为在我看来,这应类似于LINQ查询或.Equals

//'this' Makes this an extension method if you do not want this to be an extension method just remove the 'this' keyword before model
private static bool IsSame<T,T2>(this T model, T2 model2)
    {
        long changes = 0;

        foreach (var pi in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public))
        {
            var secondModelPi = typeof(T2).GetProperty(pi.Name, BindingFlags.Instance | BindingFlags.Public);
            if (secondModelPi != null)
            {
                if (!pi.GetValue(model).Equals(secondModelPi.GetValue(model2)))
                {
                    changes++;
                }
            }
        }

        return changes == 0;
    }

示例用法

model.IsSame(model2);