Я хочу знать наиболее эффективный способ сравнения двух объектов одного типа.
Одна сущность создается из XML-файла вручную (т. Е. Новый экземпляр и устанавливаются вручную свойства), а другая извлекается из контекста моего объекта.
Я хочу знать, являются ли значения свойств одинаковыми в каждом случае.
Мои первые мысли состоят в том, чтобы сгенерировать хэш значений свойств для каждого объекта и сравнить хэши, но может быть другой способ или встроенный способ?
Любые предложения будут приветствоваться.
Большое спасибо,
Джеймс
ОБНОВИТЬ
Я придумал это:
static class ObjectComparator<T>
{
static bool CompareProperties(T newObject, T oldObject)
{
if (newObject.GetType().GetProperties().Length != oldObject.GetType().GetProperties().Length)
{
return false;
}
else
{
var oldProperties = oldObject.GetType().GetProperties();
foreach (PropertyInfo newProperty in newObject.GetType().GetProperties())
{
try
{
PropertyInfo oldProperty = oldProperties.Single<PropertyInfo>(pi => pi.Name == newProperty.Name);
if (newProperty.GetValue(newObject, null) != oldProperty.GetValue(oldObject, null))
{
return false;
}
}
catch
{
return false;
}
}
return true;
}
}
}
Я еще не проверял это, это скорее пища для размышлений, чтобы генерировать больше идей из группы.
Одна вещь, которая может быть проблемой, это сравнение свойств, которые сами имеют значения сущностей, если компаратор по умолчанию сравнивает ссылку на объект, то это никогда не будет истинным. Возможное решение - перегрузить оператор равенства в моих сущностях, чтобы он сравнивался по идентификатору сущности.
Переопределите метод Equals вашего объекта и напишите реализацию, которая сравнивает свойства, которые делают его равным.
public override bool Equals(object obj)
{
return MyProperty == ((MyObject)obj).MyProperty
}