Tengo algunos objetos con un montón de campos y me veo en la necesidad de implementar GetHashCode e Igual. Es doloroso que ir aunque cada campo de forma manual por lo que les escribió así:¿Por qué no debería implementar Equals y GetHashCode usando reflection?
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;
}
Aparte de consideraciones de velocidad Por qué no debería ponerlas en práctica como ésta?
Aparte de los problemas de velocidad, tenga en cuenta que no todos las implementaciones correctas de 'GetHashCode' y' Equals' son equivalentes al algoritmo anterior. Por cierto, hay varios problemas con el código publicado. Puede eliminar la referencia 'null' en varios lugares. Además, su versión de 'Equals' utiliza la igualdad de referencia entre las propiedades correspondientes, que no es la expresión más común. – Ani
Es curioso que lo preguntes, lo es. – stimms
Use ReSharper: generará las implementaciones correctas de 'Equals' y' GetHashCode' por usted. –