В проекте, над которым я работаю, требуется некоторое простое ведение журнала аудита, когда пользователь меняет свой адрес электронной почты, адрес выставления счетов и т.д. Объекты, с которыми мы работаем, поступают из разных источников, один из служб WCF, другой веб-сайт обслуживание.
Я применил следующий метод, используя отражение, чтобы найти изменения свойств на двух разных объектах. Это генерирует список свойств, которые имеют отличия, а также их старые и новые значения.
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, вот пример кода, который генерирует положительное соответствие, основанное на выполнении объекта. 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.