Frage

  

siehe auch Hows auf schnelle Überprüfung, ob Daten   Übertragung zwei Objekte gleich   Eigenschaften in C #?

Ich habe viele Datenübertragung Objects (DTO), die jeweils enthält viele einfache Felder . Ich brauche Equals auf allen von ihnen zu implementieren (so kann ich einige Unit-Tests abschreiben deren Transport var WCF).

Der Code Ich verwende ist:

public override bool Equals(object rhs)
{

    RequestArguments other = rhs as RequestArguments;

    return
       other != null && 
       other.m_RequestId.Equals(RequestId) && 
       other.m_Type.Equals(m_Type) && 
       other.m_Parameters.Equals(m_Parameters) && 
       other.m_user.Equals(m_user);
}

Es muss ein besserer Weg! ... (die Felder aller Auflistung eher bittet um Fehler und Wartungsprobleme)

z. wir haben Gegenstand. MemberwiseClone () mit dem Cloning () Fall zu helfen, aber ich kann nichts mit Equals finden. Wir werden in voller Vertrauen laufen so eine Reflexion basierte Lösung eine Antwort ist, aber ich eher nicht das Rad neu erfinden.

(Leider erzeugen nicht die DTO aus einer domänenspezifischen Sprache sonst diese Art der Sache wäre einfach, ich bin auch nicht in der Lage das Build-System zu ändern, ein weiteren Schritt hinzuzufügen)

War es hilfreich?

Lösung

Funny sollten Sie fragen, ich kürzlich einige Code veröffentlicht zu tun genau das. Schauen Sie sich meine MemberwiseEqualityComparer zu sehen, ob es Ihren Bedürfnissen entspricht.

Es ist wirklich einfach zu bedienen und auch recht effizient. Es verwendet IL-emittieren die gesamte Equals und GetHashCode Funktion auf dem ersten Durchgang (einmal für jeden Typ verwendet wird) zu erzeugen. Es wird jedes Feld (privat oder öffentlich) des gegebenen Objekts vergleichen Sie den Standardgleichheitsvergleich für diesen Typen (EqualityComparer.Default) verwendet wird. Wir haben es in der Produktion für eine Weile und es scheint stabil, aber ich werde keine Garantien verlassen =)

Es kümmert sich um alle jene pescy kanten Fälle, die Sie selten denken, wenn Sie Ihre eigene Methode equals sind Walzen (dh, können Sie nicht Ihr eigenes Objekt mit null COMPARER, wenn Sie es in einem Objekt geboxt habe zuerst und viele der aus mehr null-Fragen).

Ich habe Sinn, eine Blog-Post, darüber zu schreiben, aber noch nicht um, um es noch bekommen. Der Code ist ein bisschen ohne Papiere, aber wenn Sie es, wie ich es reinigen könnte ein wenig.

public override int GetHashCode()
{
    return MemberwiseEqualityComparer<Foo>.Default.GetHashCode(this);
}

public override bool Equals(object obj)
{
    if (obj == null)
        return false;

    return Equals(obj as Foo);
}

public override bool Equals(Foo other)
{
    return MemberwiseEqualityComparer<Foo>.Default.Equals(this, other);
}

Die MemberwiseEqualityComparer wird unter dem MIT-Lizenz meaining Sie ziemlich viel tun können, was Sie wollen mit ihm, auch in proprietären Lösungen verwenden, ohne dass Sie die Lizenzierung ein wenig zu verändern.

Andere Tipps

Eine Option ist Reflektion zu verwenden, um alle verfügbaren Felder zu bekommen und dann bekommen und ihre Werte auf die gewünschten Objekte zu vergleichen. Dies würde Ihnen eine generische Lösung geben, aber Sie würden eine ganze Arbeit zu tun haben, wahrscheinlich Hashes mit Alex schlägt vor, eine sauberere Lösung.

Bearbeiten : Hier ist ein einfaches Beispiel ist die Reflexion des Vergleichens Objekte verwenden, sieht es auf Eigenschaften anstelle von Feldern, aber Sie bekommen die Idee: http://www.willasrari.com/blog/use-systemreflection-for-comparing-custom-objects/ 000257.aspx

Sie können ein Konzept eines Objekts Hash haben - immer dann, wenn ein Objekt ändert, können Sie den Preis für die Aktualisierung der Hash-zahlen (wobei der Hash ist buchstäblich ein Hash aller verketteten Eigenschaften). Dann, wenn Sie eine Reihe von Objekten, die nur selten ändern, es ist wirklich billig, sie zu vergleichen. Der Preis, natürlich, wird dann auf Objektbearbeitungszeit bezahlt.

Bearbeiten : sorry, ich habe nicht bemerkt, dass Sie für die Serialisierung Prüfung bitten. So dass dieser Ansatz auf jeden Fall funktioniert nicht für Sie.


Es gibt eine andere „schmutzige“ Art und Weise. Wenn Ihr Objekt serializable sowieso ist, können Sie serialize , um sie vergleichen und die resultierenden Ströme.

Das ist ziemlich langsam, aber soll sehr zuverlässig und einfach zu implementieren sein.

Wir tun dies manchmal zu überprüfen, ob jemand irgendwelche Daten in einem Editor geändert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top