Ich habe einige Objekte mit einer Reihe von Feldern und ich finde, dass ich GetHashCode und Equals implementieren muss. Es ist schmerzhaft zu gehen, obwohl jedes Feld manuell so dass ich sie wie folgt geschrieben:Warum sollte ich Equals und GetHashCode nicht mithilfe von Reflektion implementieren?
public override int GetHashCode()
{
int hash = 17;
foreach (PropertyInfo p in GetType().GetProperties())
{
hash = hash * 23 + p.GetValue(this, null).GetHashCode();
}
return hash;
}
public override bool Equals(object obj)
{
foreach (PropertyInfo p in GetType().GetProperties())
{
if (p.GetValue(obj, null) != p.GetValue(this, null))
return false;
}
return true;
}
Andere als die Geschwindigkeit Überlegungen, warum soll ich sie nicht umsetzen, wie das?
Neben Fehlern führen würde, beachten Sie, dass nicht alle korrekte Implementierungen von "GetHashCode" und "Equals" entsprechen dem obigen Algo. Übrigens gibt es einige Probleme mit dem geposteten Code. Sie könnten "null" an mehreren Stellen dereferenzieren. Darüber hinaus verwendet Ihre Version von "Equals" die Referenzgleichheit zwischen entsprechenden Eigenschaften, was nicht das am häufigsten verwendete Idiom ist. – Ani
Lustig sollten Sie fragen, es ist. – stimms
Verwenden Sie ReSharper - es erzeugt korrekte Implementierungen von 'Equals' und' GetHashCode' für Sie. –