Domanda

  

vedi anche Hows a rapido controllo se i dati   trasferimento due oggetti hanno uguale   proprietà in C #?

Non ho molta Transfer Data Objects (DTO) che ogni contiene un sacco di campi semplici . Ho bisogno di attuare Uguale su ognuna di esse (in modo da poter scrivere alcuni test di unità off li trasporta Var WCF).

Il codice che sto usando è:

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);
}

Ci deve essere un modo migliore! ... (che elenca tutti i campi è piuttosto chiedere per errori e problemi di manutenzione)

es. abbiamo oggetto. MemberwiseClone () per aiutare con il caso di clonazione (), ma non riesco a trovare nulla per aiutare con Equals. Ci sono in esecuzione in piena fiducia in modo una soluzione basata riflessione è una risposta, ma io preferisco non reinventare la ruota.

(Siamo spiacenti ma non generano il DTO da un linguaggio specifico del dominio altrimenti questo genere di cose sarebbe facile! Anche io non sono in grado di cambiare il sistema di generazione di aggiungere un altro passo)

È stato utile?

Soluzione

Funny si dovrebbe chiedere, di recente ho pubblicato un codice per fare esattamente questo. Guarda il mio MemberwiseEqualityComparer per vedere se si adatta alle tue esigenze.

E 'davvero facile da usare e molto efficace troppo. Esso utilizza IL-emettono per generare l'intero Risultato e funzione GetHashCode sulla prima corsa (una volta per ogni tipo utilizzato). Si confronterà ogni campo (privato o pubblico) dell'oggetto data utilizzando il confronto di uguaglianza predefinito per quel tipo (EqualityComparer.Default). Abbiamo usato in produzione per un po 'e sembra stabile ma lascio garanzie =)

Si prende cura di tutte quelle pescy edge-casi che raramente si pensa quando si sta rotolando il proprio metodo equals (vale a dire, non si può di confronto il proprio oggetto con null meno che non hai inscatolato in un oggetto prima e il lotto di fuori questioni più relativi a NULL).

Ho intenzione di scrivere un post su di esso, ma non ho ancora ottenuto intorno ad esso. Il codice è un po 'documentato, ma se ti piace ho potuto ripulire un po'.

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);
}

Il MemberwiseEqualityComparer è rilasciato sotto la licenza MIT meaining si può fare più o meno quello che vuoi con esso, incluso l'utilizzo in soluzioni proprietarie senza di te cambiare licenza un po '.

Altri suggerimenti

Una possibilità è quella di utilizzare la reflection per ottenere tutti i campi disponibili e quindi ottenere e confrontare i loro valori sugli oggetti desiderati. Questo darebbe una soluzione generica, ma si avrebbe un bel lavoro da fare, probabilmente utilizzando gli hash come suggerisce Alex è una soluzione più pulita.

Modifica : Ecco un semplice esempio di confronto di oggetti utilizzando la riflessione, esamina le proprietà invece di campi, ma si ottiene l'idea: http://www.willasrari.com/blog/use-systemreflection-for-comparing-custom-objects/ 000257.aspx

Si può avere un concetto di un hash oggetto - ogni volta che un oggetto cambia, si paga il prezzo di aggiornare l'hash (dove l'hash è letteralmente un hash di tutte le proprietà concatenati). Quindi, se si dispone di un gruppo di oggetti che cambiano raramente, è davvero a buon mercato per confrontarli. Il prezzo, ovviamente, viene poi versato al momento la modifica dell'oggetto.

Modifica : mi dispiace, non ho notato che si sta chiedendo per il test serializzazione. Quindi, questo approccio sicuramente non funziona per voi.


C'è un altro modo "sporco". Se il vostro oggetto è serializzabile in ogni caso, è possibile serialize di loro e confrontare i corsi d'acqua che ne derivano.

Questo è piuttosto lento, ma dovrebbe essere abbastanza affidabile e facile da implementare.

Stiamo facendo questo a volte per controllare se qualcuno ha cambiato tutti i dati in un editor.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top