Comparer 2 objets en .Net avec la réfléxion

 01/01/2019 |   Admin |  C#


Dans cet article nous allons voir comment comparer les propriétés de 2 objets en c# en utilisant la réflexion.

Nous allons utiliser le package KellermanSoftware.CompareNetObjects pour cela.

Et comparer deux objets de type "Person" avec une "Adresse" pour utiliser la comparaison des propriétés "enfant"

Classe Person et Address:
namespace PocCompareReflection
{
    public class Person
    {
        public string Name { get; set; }
  
        public DateTime DateCreated { get; set; }
  
        public int Age { get; set; }
  
        public Address Address { get; set; }
    }
  
    public class Address
    {
        public string City { get; set; }
  
        public List<string> Phones { get; set; }
    }
}
Et une application console pour éxécuter la comparaison:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using KellermanSoftware.CompareNetObjects;
  
namespace PocCompareReflection
{
    class Program
    {
        static void Main(string[] args)
        {
            CompareObjects compareObjects = new CompareObjects();
 // Objet 1
            Person person1 = new Person();
            person1.DateCreated = DateTime.Now;
            person1.Age = 29;
            person1.Name = "Jean";
            person1.Address = new Address() { City = "Paris", Phones = new List<string>() { "07.62.35.48.81", "07.62.35.48.82" } };
 // Objet 2
            Person person2 = new Person();
            person2.Name = "Pierre";
            person2.Age = 39;
            person2.DateCreated = person1.DateCreated.AddDays(1);
            person2.Address = new Address() { City = "London", Phones = new List<string>() { "07.62.35.48.83", "07.62.35.48.90" } };
 // Pour ignorer les propriétés a ne pas comparer (ici on ignore city et age)
            compareObjects.ElementsToIgnore.AddRange(new List<string>(){ "City","Age"});
// Important, par defaut maxDifferences est a 1 
            compareObjects.MaxDifferences = 100;
// True si l'on veut comparer les enfants de Person, ici Address
            compareObjects.CompareChildren = true;
            compareObjects.Compare(person1, person2);
  
// Affichage des différences de facon personnalisée (C'est dans cette boucle que 
// vous devrez traiter vos différences et les stocker en base de données par exemple)
            foreach (var item in compareObjects.Differences)
            {
                Console.WriteLine(item.PropertyName + "->"+ item.Object1Value + " - " + item.Object2Value);
            }
 // Affichage automatique
            Console.WriteLine(compareObjects.DifferencesString);
            Console.ReadKey();
        }
    }
}
Résultat: