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

C# 确定两个类中的所有属性是否相等,c#,C#,我有一个方法更新类的属性,然后使用web服务更新数据库中的对象。我想通过拉取新对象并将其与内存中的对象进行比较来验证更新是否成功 我是否需要比较每个属性,或者这将确定所有属性的值是否相同 var areEqual = objectThatHasChanges.Equals(objectSavedToDatabase); 您需要比较每个属性。如果这是两个引用类型对象,equals方法将只使用默认的equal实现,它将检查对象是否为相同的实例: 如果当前实例是引用类型,那么Equals(Obje

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

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

var areEqual = objectThatHasChanges.Equals(objectSavedToDatabase);

您需要比较每个属性。如果这是两个引用类型对象,equals方法将只使用默认的equal实现,它将检查对象是否为相同的实例:

如果当前实例是引用类型,那么Equals(Object)方法 测试引用的相等性,以及对Equals(Object)方法的调用 相当于调用ReferenceEquals方法。参考文献 相等意味着要比较的对象变量引用 同一个物体。下面的示例说明了这种方法的结果 比较。它定义了一个Person类,它是一个引用类型, 并调用Person类构造函数实例化两个新Person 具有相同值的对象person1a和person2。它也 将person1a分配给另一个对象变量person1b。作为输出 从示例中可以看出,person1a和person1b是相等的,因为它们 引用同一对象。然而,person1a和person2不是 相等,尽管它们具有相同的值

您应该重载“Equals”方法并编写自己的方法来比较每个或关键属性(如上次修改日期、修订版等),或者编写一个方法来获取这两个对象并比较它们


若在不同的对象中有很多字段,那个么可以编写一个通用方法,该方法使用反射来迭代对象中的所有属性,并和其他属性进行比较。当然,首先检查两个对象是否属于同一类型。

如果确实要检查更新是否成功,请按以下方式执行操作:

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;
}
为了详细说明的答案,如果您想将其用于多种不同的类型,则需要使用泛型类型。我还将该类转换为扩展方法,因为在我看来,这应该与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);