2011-02-09 11 views

risposta

145

Una soluzione flessibile: Si potrebbe utilizzare la riflessione per enumerare tutte le proprietà e determinare quali sono e non sono uguali, per poi tornare qualche lista delle proprietà ed entrambi i valori differenti.

Ecco un esempio di codice che è un buon inizio per quello che stai chiedendo. Guarda solo i valori Field in questo momento, ma puoi aggiungere qualsiasi numero di altri componenti per farlo controllare attraverso il reflection. È implementato usando un metodo di estensione in modo che tutti i tuoi oggetti possano usarlo.

USO

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

La mia classe di esempio per confrontare contro

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

E LA CARNE E PATATE

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 per "CARNE E PATATE" – Kehlan

+17

Utilizzare if (! Equals (v.valA, v.valB)) al posto di if (! V.valA.Equals (v.valB)) per impedire NullException – Jerome2606

+0

Perché no proprietà auto? –

10

Il metodo Equals e l'interfaccia IEquatable<T> potrebbe essere utilizzato per conoscere se due oggetti sono uguali ma non ti permetteranno di sapere le differenze tra gli oggetti. È possibile utilizzare la riflessione confrontando i valori di ciascuna proprietà.

Un altro approccio potrebbe consistere nel serializzare tali istanze in un formato di testo e confrontare le differenze all'interno delle stringhe risultanti (XML, JSON, ...).

+2

Penso che non stia cercando test di uguaglianza, ma piuttosto la raccolta di ragioni per cui i due oggetti non corrispondono. – deepee1

+0

Certo, ma questo non ha senso visto che non abbiamo idea di cosa sia contenuto nella classe Customer – Rob

+0

@ deepee1, @Rob, sono d'accordo che 'Equals' e' IEquatable 'non consentono di trovare le differenze. La riflessione potrebbe essere utilizzata in questo caso. –