2 votes

Comment comparer 2 classes

J'ai deux classes et leurs variables sont exactement les mêmes.(Pour ne pas prolonger la question, je n'explique pas pourquoi j'utilise la même classe). Je compare les mêmes variables dans ces deux classes avec Reflection. La fonction renvoie vrai s'il y a une variable dont la valeur a changé . Cependant, cette fonction que j'ai écrite ne fait pas la comparaison correctement s'il y a une liste dans la classe. Elle renvoie vrai pour les listes identiques et inchangées, mais le résultat devrait être faux

Supposons que la liste est complète et que les mêmes valeurs

CLASSE UN

CLASSE DEUX

ID = 5

ID = 5

Nombre = 10

Nombre = 10

Liste a

Liste a

 private bool Compare(Class A, Class B)
        {
            A.GetType().GetProperties().ToList().ForEach(p =>
            {
                B.GetType().GetProperties().ToList().ForEach(p2 =>
                {
                    if (p.Name == p2.Name)
                    {

                        if
                         (!p.GetValue(A).Equals(p2.GetValue(B)))
                        {
                            result = true;
                        }

                    }
                } 
                );
            });

            return result;
        }

0voto

TOOL Points 48

Tout d'abord, je vous recommande de mettre en œuvre IEquatable https://docs.microsoft.com/en-us/dotnet/api/system.iequatable-1?view=net-6.0 .

Ensuite, il est difficile d'être sûr à 100%, mais votre problème est probablement de retourner vrai lorsque les valeurs ne sont pas égales.

Enfin, votre problème avec les listes est probablement dû au fait que l'égalité avec les listes utilise la référence à la liste et non les valeurs qu'elle contient.

Puisque vous utilisez la réflexion, je ne pense pas qu'il soit préférable de gérer explicitement le cas de la liste. Une façon de le faire serait de créer une classe enveloppe qui implémente la fonction Equals() avec quelque chose comme ceci :

if (listA.Except(listB).Any())

https://stackoverflow.com/a/9524717/12330678

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