qual è il modo migliore per confrontare due oggetti e trovare le differenze?Confronta due oggetti e trova le differenze
Customer a = new Customer();
Customer b = new Customer();
qual è il modo migliore per confrontare due oggetti e trovare le differenze?Confronta due oggetti e trova le differenze
Customer a = new Customer();
Customer b = new Customer();
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; }
}
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, ...).
Penso che non stia cercando test di uguaglianza, ma piuttosto la raccolta di ragioni per cui i due oggetti non corrispondono. – deepee1
Certo, ma questo non ha senso visto che non abbiamo idea di cosa sia contenuto nella classe Customer – Rob
@ deepee1, @Rob, sono d'accordo che 'Equals' e' IEquatable
+1 per "CARNE E PATATE" – Kehlan
Utilizzare if (! Equals (v.valA, v.valB)) al posto di if (! V.valA.Equals (v.valB)) per impedire NullException – Jerome2606
Perché no proprietà auto? –