157 votes

Comparer les propriétés de deux objets pour trouver des différences ?

J'ai deux objets du même type, et je veux parcourir en boucle les propriétés publiques de chacun d'entre eux et alerter l'utilisateur sur les propriétés qui ne correspondent pas.

Est-il possible de le faire sans connaître les propriétés de l'objet ?

0 votes

Je pense que cela vous aidera... Interroger les propriétés et les valeurs

0 votes

4voto

Comparaison de deux objets de même type à l'aide de LINQ et de Reflection. NB ! Il s'agit essentiellement d'une réécriture de la solution de Jon Skeet, mais avec une syntaxe plus compacte et plus moderne. Elle devrait également générer une IL légèrement plus efficace.

Voici comment cela se passe :

public bool ReflectiveEquals(LocalHdTicket serverTicket, LocalHdTicket localTicket)
  {
     if (serverTicket == null && localTicket == null) return true;
     if (serverTicket == null || localTicket == null) return false;

     var firstType = serverTicket.GetType();
     // Handle type mismatch anyway you please:
     if(localTicket.GetType() != firstType) throw new Exception("Trying to compare two different object types!");

     return !(from propertyInfo in firstType.GetProperties() 
              where propertyInfo.CanRead 
              let serverValue = propertyInfo.GetValue(serverTicket, null) 
              let localValue = propertyInfo.GetValue(localTicket, null) 
              where !Equals(serverValue, localValue) 
              select serverValue).Any();
  }

3voto

Randolpho Points 36512

Type.GetProperties énumère toutes les propriétés d'un type donné. Utilisez ensuite PropertyInfo.GetValue pour vérifier les valeurs.

1voto

simon w Points 1

Comme beaucoup ont mentionné l'approche récursive, il s'agit de la fonction à laquelle vous pouvez passer le nom recherché et la propriété par laquelle commencer :

    public static void loopAttributes(PropertyInfo prop, string targetAttribute, object tempObject)
    {
        foreach (PropertyInfo nestedProp in prop.PropertyType.GetProperties())
        {
            if(nestedProp.Name == targetAttribute)
            {
                //found the matching attribute
            }
            loopAttributes(nestedProp, targetAttribute, prop.GetValue(tempObject);
        }
    }

//in the main function
foreach (PropertyInfo prop in rootObject.GetType().GetProperties())
{
    loopAttributes(prop, targetAttribute, rootObject);
}

0voto

Rafael Pizao Points 326

Comparer les objets NET peut vous aider !

CompareLogic logic = new CompareLogic();
var compare = logic.Compare(obj1, obj2);
comparacao.Differences.ForEach(diff => Debug.Write(diff.PropertyName));
// Or formatted summary
Debug.Write(comparacao.DifferencesString);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X