Eigenschaften automatisch vergleichen

8

Ich möchte die Namen aller Eigenschaften erhalten, die sich für übereinstimmende Objekte geändert haben. Ich habe diese (vereinfachten) Klassen:

%Vor%

Nun möchte ich die Objekte, bei denen sich die Property-Werte unterscheiden, erhalten:

%Vor%

Am Ende hätte ich gerne eine Liste von Difference s wie folgt:

%Vor%

Der ChangedProperties sollte den Namen der geänderten Eigenschaften enthalten.

    
juergen d 17.06.2013, 20:06
quelle

5 Antworten

5

Ich habe eine ganze Weile damit verbracht, eine schnellere, auf Reflektion basierende Lösung zu schreiben, indem ich typisierte Delegierte verwendete. Aber schließlich gab ich auf und wechselte zu Marc Gravell Fast-Member-Bibliothek , um eine höhere Leistung als bei normaler Reflexion zu erreichen.

Code:

%Vor%

Verwendung:

%Vor%

Leistung:

Meine sehr einseitigen Messungen zeigten, dass dieser Ansatz etwa 4-6 mal schneller ist als die Json-Umwandlung und etwa 9 mal schneller als gewöhnliche Reflexionen. Aber in Fairness könnten Sie wahrscheinlich die anderen Lösungen ziemlich schnell beschleunigen.

Einschränkungen:

Im Moment rekurviert meine Lösung nicht über verschachtelte Listen, zum Beispiel vergleicht sie nicht einzelne Subject -Elemente - sie erkennt nur, dass die Themenlisten unterschiedlich sind, aber nicht was oder wo. Es sollte jedoch nicht schwer sein, diese Funktion hinzuzufügen, wenn Sie sie benötigen. Der schwierigste Teil wäre wahrscheinlich zu entscheiden, wie diese Unterschiede in der Klasse Difference dargestellt werden sollen.

    
djf 23.06.2013 01:24
quelle
3

Wir beginnen mit 2 einfachen Methoden:

%Vor%

AreEqual vergleicht nur die serialisierten Versionen von zwei Objekten mit Json.Net. Dies verhindert, dass Referenztypen und Werttypen anders behandelt werden.

GetDifference überprüft die Eigenschaften der übergebenen Objekte und vergleicht sie einzeln.

Um eine Liste der Unterschiede zu erhalten:

%Vor%     
Patrick Hallisey 21.06.2013 03:38
quelle
1

Jeder versucht immer, sich etwas auszudenken und schreibt diese übermäßig generischen Wege, Daten zu extrahieren. Dafür entstehen Kosten.

Warum nicht einfach Old School sein?

Haben Sie eine GetDifferences-Memberfunktion Person.

%Vor%

In geerbten Klassen. Überschreiben Sie und fügen Sie ihre spezifischen Eigenschaften hinzu. AddRange die Basisfunktion.

KISS - Halten Sie es einfach. Man braucht 10 Minuten Affenarbeit, um es zu schreiben, und man weiß, es wird effizient und funktionieren.

    
CodeMonkeyForHire 24.06.2013 15:31
quelle
0

Ich mache es mit diesem:

%Vor%     
Martin Ch 17.06.2013 21:11
quelle
0

Hier haben Sie einen Code, der mit Reflection funktioniert.

%Vor%     
varocarbas 22.06.2013 17:48
quelle

Tags und Links