La question provient de la comparaison des tables de base de données. Disons que nous mettons la ligne gauche dans l'instance Gauche et la droite dans l'instance Droite du même type. Et nous avons beaucoup de tables et types respectifs.Comparaison de diff de comparaison d'objet générique
Comment implémenter une routine plus ou moins générique résultant en une collection de diffs par ex.
propertyName, leftValue, rightValue pour chaque paire d'instances du même type. En dehors de l'algorithme de comparaison générique puisque leftValue et rightValue peuvent être n'importe quoi (paire de chaînes ou int ou DateTime ou Guid) n'est pas évident comment combiner tout cela dans une collection.
EDIT:
class OneOfManyTypesBasedOnTableRow
{
Guid uid,
int anotherId,
string text1,
string text2,
DateTime date1,
DateTime date2
}
class AnotherOfManyTypesBasedOnTableRow
{
Guid uid,
int anotherId,
string text3,
string text4,
DateTime date3,
DateTime date4
}
//For type 1
OneOfManyTypesBasedOnTableRow Left = new Something().GetLeft() ;
OneOfManyTypesBasedOnTableRow Right = new Something().GetRight() ;
DiffCollection1 diff1 = comparer.GetDiffForOneOfManyTypesBasedOnTableRow (Left , Right) ;
//For type 2
AnotherOfManyTypesBasedOnTableRow Left = new SomethingElse().GetLeft() ;
AnotherOfManyTypesBasedOnTableRow Right = new SomethingElse().GetRight() ;
DiffCollection2 diff2 = comparer.GetDiffForAnotherOfManyTypesBasedOnTableRow (Left , Right) ;
Mon problème est que je ne sais pas comment éviter la répétition de ce code assez similaire pour chaque type. Cela pourrait convenir à la population d'objets. Mais dans les méthodes diff je dois coder
if Left.Text1.Equals (Right.Text1)
et ainsi de suite dans une méthode
if Left.Text3.Equals (Right.Text3)
et ainsi de suite dans une autre méthode
Pouvez-vous mettre en place un code de pseudo décrivant ceci. –
Une chose que j'ai faite est de faire une méthode qui renvoie une liste des valeurs (dans l'ordre) qui sont "importantes". Ensuite, j'utilise cet objet liste (pas l'objet réel) pour comparer l'égalité et générer un hachage.Ceci est similaire à un processus légèrement plus automatisé comme mentionné dans la réponse de Mathew mais place la sélection "champ d'importation" entre les mains de l'objet (les attributs pourraient aussi être utilisés je suppose). Cela peut être fait très facilement à travers un certain nombre d'objets avec une interface et une aide statique ou une méthode d'extension - devrait être inférieure à ~ 8 lignes de code par classe. –