Проект, над которым я работаю, требует некоторого простого аудита, когда пользователь меняет свой адрес электронной почты, адрес выставления счетов и т. Д. Объекты, с которыми мы работаем, исходят из разных источников, WCF, другой - веб-сервис.Поиск различий свойств между двумя объектами C#
Я использовал следующий метод, используя отражение, чтобы найти изменения свойств на двух разных объектах. Это создает список свойств, которые имеют отличия, а также их старые и новые значения.
public static IList GenerateAuditLogMessages(T originalObject, T changedObject)
{
IList list = new List();
string className = string.Concat("[", originalObject.GetType().Name, "] ");
foreach (PropertyInfo property in originalObject.GetType().GetProperties())
{
Type comparable =
property.PropertyType.GetInterface("System.IComparable");
if (comparable != null)
{
string originalPropertyValue =
property.GetValue(originalObject, null) as string;
string newPropertyValue =
property.GetValue(changedObject, null) as string;
if (originalPropertyValue != newPropertyValue)
{
list.Add(string.Concat(className, property.Name,
" changed from '", originalPropertyValue,
"' to '", newPropertyValue, "'"));
}
}
}
return list;
}
Я ищу System.IComparable, потому что "Все числовые типы (например, Int32 и Double) осуществлять IComparable, как это делают String, Char и DateTime." Это казалось лучшим способом найти любое свойство, которое не является обычным классом.
Нажатие на событие PropertyChanged, созданное с помощью прокси-кода WCF или веб-службы, звучит неплохо, но не дает мне достаточно информации для моих журналов аудита (старые и новые значения).
Ищите информацию о том, есть ли лучший способ сделать это, спасибо!
@Aaronaught, вот пример кода, который генерирует положительный матч на основе делать Object.equals:
Address address1 = new Address();
address1.StateProvince = new StateProvince();
Address address2 = new Address();
address2.StateProvince = new StateProvince();
IList list = Utility.GenerateAuditLogMessages(address1, address2);
«[Адрес] StateProvince изменен с 'MyAccountService.StateProvince' в ' MyAccountService.StateProvince '"
Это два разных экземпляра класса StateProvince, но значения свойств одинаковы (в этом случае все нули). Мы не переопределяем метод equals.
К сожалению, используя только Object.equals возвращается справедливо для ссылочных типов, например: [Адрес] StateProvince изменен с «MyAccountService.StateProvince» до «» MyAccountService.StateProvince –
@Pete Нельсон: Предполагая, что вы фактически сравнивая разные ссылки, это ... невероятно. Можем ли мы увидеть полный пример с классом? Переопределяет ли это метод 'Equals'? Я использую код, очень похожий на этот, и он никогда не дает ложных негативов. – Aaronaught
Добавлен пример матча к исходному сообщению. –