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