Ich habe zwei Objekte des gleichen Typs und möchte die öffentlichen Eigenschaften für jedes Objekt durchlaufen und den Benutzer darüber informieren, welche Eigenschaften nicht übereinstimmen.
Ist dies möglich, ohne zu wissen, welche Eigenschaften das Objekt enthält?
Antworten:
Ja, mit Reflexion - vorausgesetzt, jeder Eigenschaftstyp wird
Equals
entsprechend implementiert . Eine Alternative wäre dieReflectiveEquals
rekursive Verwendung für alle außer einigen bekannten Typen, aber das wird schwierig.quelle
Sicher können Sie mit Reflexion. Hier ist der Code zum Abrufen der Eigenschaften eines bestimmten Typs.
Wenn Sie mehr Informationen darüber geben können, was Sie über die Eigenschaften vergleichen, können wir einen grundlegenden unterschiedlichen Algorithmus zusammenstellen. Dieser Code für die Instanz unterscheidet sich in den Namen
quelle
.Select(...)
Ich weiß, dass dies wahrscheinlich übertrieben ist, aber hier ist meine ObjectComparer-Klasse, die ich genau für diesen Zweck verwende:
quelle
Das eigentliche Problem: Wie erhält man die Differenz zweier Sätze?
Der schnellste Weg, den ich gefunden habe, besteht darin, die Mengen zuerst in Wörterbücher umzuwandeln und dann zu unterscheiden. Hier ist ein allgemeiner Ansatz:
Dann können Sie so etwas tun:
quelle
Ja. Verwenden Sie Reflexion . Mit Reflection können Sie Dinge tun wie:
Und dann können Sie die resultierenden PropertyInfo-Klassen verwenden, um alle möglichen Dinge zu vergleichen.
quelle
Vergleichen zweier Objekte desselben Typs mit LINQ und Reflection. NB! Dies ist im Grunde eine Neufassung der Lösung von Jon Skeet, jedoch mit einer kompakteren und moderneren Syntax. Es sollte auch eine etwas effektivere IL erzeugen.
Es geht ungefähr so:
quelle
where !Equals(serverValue, localValue)
durchfirstType.IsValueType ? !Equals(serverValue, localValue) : !ReflectiveEquals(serverValue, localValue)
Type.GetProperties listet alle Eigenschaften eines bestimmten Typs auf. Verwenden Sie dann PropertyInfo.GetValue , um die Werte zu überprüfen.
quelle
Wie viele den rekursiven Ansatz erwähnt haben, können Sie mit dieser Funktion den gesuchten Namen und die Eigenschaft zunächst an Folgendes übergeben:
quelle