2011-02-09 26 views

Respuesta

145

Una solución flexible: Se puede utilizar la reflexión para enumerar todas las propiedades y determinar cuáles son y no son iguales, entonces volver alguna lista de propiedades y ambos valores diferentes.

Aquí hay un ejemplo de código que es un buen comienzo para lo que está preguntando. Solo mira los valores de Field en este momento, pero podría agregar cualquier cantidad de otros componentes para verificar a través de la reflexión. Se implementa utilizando un método de extensión para que todos sus objetos puedan usarlo.

USAR

SomeCustomClass a = new SomeCustomClass(); 
    SomeCustomClass b = new SomeCustomClass(); 
    a.x = 100; 
    List<Variance> rt = a.DetailedCompare(b); 

Mi clase de muestra para comparar contra

class SomeCustomClass 
    { 
     public int x = 12; 
     public int y = 13; 
    } 

Y LA CARNE Y PATATAS

using System.Collections.Generic; 
using System.Reflection; 

static class extentions 
{ 
    public static List<Variance> DetailedCompare<T>(this T val1, T val2) 
    { 
     List<Variance> variances = new List<Variance>(); 
     FieldInfo[] fi = val1.GetType().GetFields(); 
     foreach (FieldInfo f in fi) 
     { 
      Variance v = new Variance(); 
      v.Prop = f.Name; 
      v.valA = f.GetValue(val1); 
      v.valB = f.GetValue(val2); 
      if (!v.valA.Equals(v.valB)) 
       variances.Add(v); 

     } 
     return variances; 
    } 


} 
class Variance 
{ 
    public string Prop { get; set; } 
    public object valA { get; set; } 
    public object valB { get; set; } 
} 
+50

+1 para "CARNE Y PATATAS" – Kehlan

+17

Usar if (! Es igual a (v.valA, v.valB)) en lugar de if (! V.valA.Equals (v.valB)) para prevenir NullException – Jerome2606

+0

¿Por qué no? propiedades de auto? –

10

El método Equals y la interfaz IEquatable<T> podría utilizarse para conocer si dos objetos son iguales pero no te permitirán saber las diferencias entre los objetos. Puede usar la reflexión comparando los valores de cada propiedad.

Otro enfoque más podría consistir en serializar esas instancias en algún formato de texto y comparar las diferencias dentro de las cadenas resultantes (XML, JSON, ...).

+2

Creo que no está buscando pruebas de igualdad, sino la colección de razones por las cuales los dos objetos no coinciden. – deepee1

+0

Claro, pero eso realmente no tiene sentido ya que no tenemos idea de lo que está contenido en la clase de Cliente – Rob

+0

@ deepee1, @Rob, estoy de acuerdo en que 'Igual' y' IEtableable 'no permiten encontrar las diferencias. La reflexión podría usarse en este caso. –

Cuestiones relacionadas