Comparar dos objetos complejos de la misma clase para ver si son iguales

Imagina que tienes dos objetos de la misma clase (clase que contiene subclases, propiedades, subclases que contienen más propiedades, etc ..) y necesitas comparar estos dos objetos para ver si son iguales o no. Este método que te mostramos hoy no necesita de IEquals ni interfaces de IComparable a heredar. Puede parecerte que esta práctica es un poco de nicho y que tiene poca utilidad, pero para nada es así. Cuando estemos usando una función y nos pasen por parámetro un objeto el cual no sepamos su procedencia, una buena práctica para saber a qué clase pertenece es compararlo con otro objeto ya existente. En este artículo os vamos a explicar cómo comparar dos objetos complejos de la misma clase para ver si son iguales. ¿Estás preparado para aprender cómo llevarlo a cabo en tus proyectos? Pues presta atención.

Crea una clase estática con el nombre "CompareTwoObjects" y añade el código que te mostramos más abajo:

public static object CompareEquals(this T objectFromCompare, T objectToCompare)

{

   if (objectFromCompare == null && objectToCompare == null)
      return true;

   else if (objectFromCompare == null && objectToCompare != null)
      return false;

   else if (objectFromCompare != null && objectToCompare == null)
      return false;

   PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
   foreach (PropertyInfo prop in props)
      {
          object dataFromCompare = objectFromCompare.GetType().GetProperty(prop.Name).GetValue(objectFro                                   mCompare, null);

          object dataToCompare = objectToCompare.GetType().GetProperty(prop.Name).GetValue(objectToCompa                                  re, null);

          Type type = objectFromCompare.GetType().GetProperty(prop.Name).GetValue(objectToCompare,null).                       GetType();

          if (prop.PropertyType.IsClass && !prop.PropertyType.FullName.Contains("System.String"))

             {

                 dynamic convertedFromValue = Convert.ChangeType(dataFromCompare, type);
                 dynamic convertedToValue = Convert.ChangeType(dataToCompare, type);

                 object result = CompareTwoObjects.CompareEquals(convertedFromValue, convertedToValue);

                 bool compareResult = (bool)result;
                 if (!compareResult)
                    return false;
              }

          else if (!dataFromCompare.Equals(dataToCompare))
              return false;
       }

  return true;

}

Con esta función podremos saber si todas las propiedades de la clase y de las subclases contiene el mismo valor o no.
Modo de uso: Objeto1.Compare Equals (Objeto2);

Antes de llevar a cabo esta práctica me di cuenta que para comparar dos objetos necesitamos utilizar IEquals einterfaces IComparable para luego recorrer cada una de las propiedades explícitamente para asegurarnos de que el valor es idéntico o no. Pero este código es un código genérico y es fiable y también independiente.

Espero que este tutorial os sirva de ayuda y que lo sepáis aplicar en vuestros proyectos. En programacion.net siempre estaremos dispuestos a echarte una mano en lo que necesites, siempre y cuando tenga que ver con el mundo de la programación, que ya os veo venir. Ya sabéis, si queréis sugerir un tema que queráis que tratemos en los artículos futuros, por favor, decídnoslo en la zona de comentarios que podéis observar más abajo de este texto. ¡Un saludo y feliz código amigos!

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.