Le projet que je suis en train de travailler sur les besoins du simple enregistrement d'audit lorsqu'un utilisateur modifie son e-mail, adresse de facturation, etc. Les objets qui nous travaillons sont issues de différentes sources, l'une d'un service WCF, de l'autre un service web.
J'ai implémenté la méthode suivante à l'aide de la réflexion pour trouver les changements de propriétés sur deux objets différents. Cela génère une liste des propriétés qui ont des différences avec leurs anciennes et nouvelles valeurs.
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;
}
Je suis à la recherche pour le Système.IComparable parce que "Tous les types numériques (tels que Int32 et Double) mettre en œuvre IComparable, comme String, Char, et DateTime." Cela semblait la meilleure façon de trouver un bien qui n'est pas une classe personnalisée.
Puisant dans l'événement PropertyChanged généré par la WCF ou de proxy de service web code sonnait bien, mais ne me donne pas assez d'info pour mon des journaux d'audit (anciennes et nouvelles valeurs).
À la recherche pour l'entrée que si il ya une meilleure façon de le faire, merci!
@Aaronaught, voici un exemple de code qui génère une correspondance positive basée sur le fait de faire de l'objet.Est égal à:
Address address1 = new Address();
address1.StateProvince = new StateProvince();
Address address2 = new Address();
address2.StateProvince = new StateProvince();
IList list = Utility.GenerateAuditLogMessages(address1, address2);
"[Adresse] StateProvince changé de 'MyAccountService.StateProvince' à 'MyAccountService.StateProvince'"
C'est à deux instances différentes de la StateProvince classe, mais les valeurs des propriétés sont les mêmes (tous les null dans ce cas). Nous ne sommes pas en substitution de la méthode equals.