2011-02-23 3 views
2

J'ai le code comme ceci:égalité objets comparant

public bool AreSame(CreditProposal creditProposal) 
    { 
     if (!ContractingParty.Equals(creditProposal.ContractingParty)) 
      return false; 
     if (!UltimateParent.Equals(creditProposal.UltimateParent)) 
      return false; 
     if (!Rebound.Equals(creditProposal.Rebound)) 
      return false; 
     if (!ContactPerson.Equals(creditProposal.ContactPerson)) 
      return false; 
     if (!DateOfVisit.Equals(creditProposal.DateOfVisit)) 
      return false; 
     .... and so on 10 more times 

est-il un moyen de faire plus concis? Ou est-ce que ça veut dire que j'entre dans l'enfer de la réflexion?

+0

Pourriez-vous remplacer l'opérateur d'égalité sur CreditProposal? – Nick

Répondre

4

Remplacer la méthode Equals.

Vérifier this on MSDN

Et remarquez If you implement ==, you must implement !=.

+3

Et si vous remplacez 'Equals()', [override GetHashCode() trop] (http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method -is-overriden-in-c/371348 # 371348) –

+0

@Marc point pris, il me faut une certaine logique pour comprendre votre réponse si;) –

2

La manière instinctive de gérer cette situation consiste à remplacer la méthode Object.Equals(Object) et à implémenter IEquatable<T> pour votre type. Toutefois, en surchargeant Object.Equals, vous devrez également remplacer Object.GetHashCode(), ce qui est beaucoup plus difficile à faire correctement. Plus particulièrement, GetHashCode() doit renvoyer la même valeur chaque fois qu'il est appelé sur la même instance et doit renvoyer la même valeur pour deux objets considérés comme égaux. Si votre type est mutable, cela devient une vraie douleur. (En fait, GetHashCode() est si difficile à mettre en œuvre correctement, il y a une balise entière pour sur StackOverflow: https://stackoverflow.com/questions/tagged/gethashcode)

La mise en œuvre statique pour Equals ressemble généralement à ceci:

public static bool Equals(CreditProposal proposalA, CreditProposal proposalB) 
{ 
    // Check whether both values are null. 
    if(object.ReferenceEquals(proposalA, null) 
     && object.ReferenceEquals(proposalB, null)) 
    { 
     return true; 
    } 

    // Check whether either value is null. 
    if(object.ReferenceEquals(proposalA, null) 
     || object.ReferenceEquals(proposalB, null)) 
    { 
     return false; 
    } 

    // Check whether hashcodes are different. 
    if(proposalA.GetHashCode() != proposalB.GetHashCode()) 
    { 
     return false; 
    } 

    // Check for value equality. 
    return Party.Equals(
      proposalA.ContractingParty, 
      proposalB.ContractingParty) 
     && ParentProposal.Equals(
      proposalA.UltimateParent, 
      proposalB.UltimateParent); 
     // Add more conditions for equality here. 
} 

Vous appelleriez cette mise en œuvre de toutes vos méthodes d'instance.