El proyecto en el que estoy trabajando necesita un registro de auditoría simple para cuando un usuario cambia su correo electrónico, dirección de facturación, etc. Los objetos con los que trabajamos provienen de diferentes fuentes, una WCF service, el otro es un servicio web.Encontrar diferencias de propiedad entre dos objetos C#
Implementé el siguiente método usando la reflexión para encontrar cambios en las propiedades de dos objetos diferentes. Esto genera una lista de las propiedades que tienen diferencias junto con sus valores antiguos y nuevos.
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;
}
Busco System.IComparable porque "Todos los tipos numéricos (como Int32 y doble) implementan IComparable, al igual que las cuerdas, Char, y DateTime." Esta parecía la mejor forma de encontrar cualquier propiedad que no sea una clase personalizada.
Al tocar en el evento PropertyChanged generado por el WCF o el código proxy del servicio web sonaba bien, pero no me da suficiente información para mis registros de auditoría (valores antiguos y nuevos).
Buscando información sobre si hay una mejor manera de hacerlo, gracias!
@Aaronaught, aquí es un código de ejemplo que está generando un resultado positivo basado en Object.equals haciendo:
Address address1 = new Address();
address1.StateProvince = new StateProvince();
Address address2 = new Address();
address2.StateProvince = new StateProvince();
IList list = Utility.GenerateAuditLogMessages(address1, address2);
"[Dirección] StateProvince cambiado de 'MyAccountService.StateProvince' a ' MyAccountService.StateProvince '"
Son dos instancias diferentes de la clase StateProvince, pero los valores de las propiedades son los mismos (todos nulos en este caso). No estamos anulando el método de igualdad.
usando Desafortunadamente solo Object.equals está volviendo cierto para los tipos de referencia, por ejemplo: [Dirección] StateProvince cambió de 'MyAccountService.StateProvince' a 'MyAccountService.StateProvince' –
@Pete Nelson: Suponiendo que estés en realidad, comparando diferentes referencias, eso es ... improbable. ¿Podemos ver un ejemplo completo con la clase? ¿Reemplaza el método 'Igual'? Uso un código muy similar a esto y nunca da falsos negativos. – Aaronaught
Se agregó un ejemplo de coincidencia con la publicación original. –