jaki jest najlepszy sposób porównania dwóch obiektów i znalezienia różnic?Porównaj dwa obiekty i znajdź różnice
Customer a = new Customer();
Customer b = new Customer();
jaki jest najlepszy sposób porównania dwóch obiektów i znalezienia różnic?Porównaj dwa obiekty i znajdź różnice
Customer a = new Customer();
Customer b = new Customer();
Jedno elastyczne rozwiązanie: Można użyć refleksji wyliczyć przez wszystkich właściwości i określić, które są i nie są sobie równe, a następnie powrót jakąś listę właściwości i zarówno różne wartości.
Oto przykład kodu, który jest dobrym początkiem tego, o co prosisz. Analizuje teraz tylko wartości pól, ale możesz dodać dowolną liczbę innych składników, aby sprawdzić odbicie. Jest zaimplementowany przy użyciu metody rozszerzenia, aby wszystkie obiekty mogły z niego korzystać.
KORZYSTAĆ
SomeCustomClass a = new SomeCustomClass();
SomeCustomClass b = new SomeCustomClass();
a.x = 100;
List<Variance> rt = a.DetailedCompare(b);
moja klasa przykładowy porównać przeciwko
class SomeCustomClass
{
public int x = 12;
public int y = 13;
}
a mięso i ziemniaki
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; }
}
Sposób Equals
a interfejs IEquatable<T>
mogłyby zostać wykorzystane do poznania jeśli dwa obiekty są równe, ale nie pozwalają ci poznać różnice między obiektami. Możesz użyć odbicia, porównując każdą wartość właściwości.
Jeszcze inne podejście może polegać na serializowaniu tych wystąpień w pewnym formacie tekstowym i porównywaniu różnic między łańcuchami wynikowymi (XML, JSON, ...).
Myślę, że on nie szuka testów równości, ale raczej zbiór powodów, dla których te dwa przedmioty nie pasują. – deepee1
Jasne, ale to nie ma większego sensu, ponieważ nie mamy pojęcia, co zawiera klasa klienta: – Rob
@ deepee1, @Rob, Zgadzam się, że 'Equals' i' IEquatable
+1 dla "mięso i ziemniaki" – Kehlan
Zastosowanie if (! Equals (v.valA, v.valB)) zamiast if (! V.valA.Equals (v.valB)) w celu zapobiega NullException – Jerome2606
Dlaczego nie właściwości automatyczne? –