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.
Pourriez-vous remplacer l'opérateur d'égalité sur CreditProposal? – Nick