2011-02-09 16 views

Odpowiedz

145

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; } 
} 
+50

+1 dla "mięso i ziemniaki" – Kehlan

+17

Zastosowanie if (! Equals (v.valA, v.valB)) zamiast if (! V.valA.Equals (v.valB)) w celu zapobiega NullException – Jerome2606

+0

Dlaczego nie właściwości automatyczne? –

10

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, ...).

+2

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

+0

Jasne, ale to nie ma większego sensu, ponieważ nie mamy pojęcia, co zawiera klasa klienta: – Rob

+0

@ deepee1, @Rob, Zgadzam się, że 'Equals' i' IEquatable 'nie pozwala na znalezienie różnic. W tym przypadku można zastosować odbicie. –