Bother,
Tenta esse método abaixo, ele compara propriedade por propriedade da
classe e retorna se alguma estiver diferente.
É só você colocar em uma classe pai e herdar todas dela. Que todos os
equals vão retornar do jeito que você quer.
No seu caso retorna diferente por que o algoritmo do framework inclui
o espaço de memória na comparação, sendo assim ainda que os todos
objetos sejam idênticos em seus dados eles estão em dois espaços de
memória diferente por isso retorna diferente.
Para esse meu método você vai precisar de uma annotation que eu criei
para marcar quando uma propriedade não deve ser considerada na
comparação. você coloca sobre ela [isComparible(false)] e pronto o
equals não compara ela. Em seguida tem o código dela também. Não é a
solução mais elegante, mas é bem funcional. Espero ter ajudado.
Abraços.
public override bool Equals(object obj)
{
if (obj==null||GetType() != obj.GetType())
{
return false;
}
System.Reflection.PropertyInfo[] campos = GetType().GetProperties();
for (int i = 0; i < campos.Length; i++)
{
bool comparavel = true;
Object[] AttArray =
campos[i].GetCustomAttributes(typeof(Annotations.IsComparable),
false);
if (AttArray.Length > 0)
{
Annotations.IsComparable objIsCompar =
(Annotations.IsComparable)AttArray[0];
comparavel = objIsCompar.COMPARAVEL;
}
if (comparavel)
{
if (campos[i].GetValue(this, null) == null) {
if (campos[i].GetValue(obj, null) != null)
return false;
}
if (!campos[i].GetValue(this,
null).Equals(campos[i].GetValue(obj, null)))
return false;
}
}
return true;
}
//Annotation
[AttributeUsage(AttributeTargets.Property)]
public class IsComparable : System.Attribute
{
private bool Comparavel;
public IsComparable(bool Comparavel)
{
this.Comparavel = Comparavel;
}
public bool COMPARAVEL {
get { return Comparavel; }
set { Comparavel = value; }