Como usar Object.GetHashCode() em um tipo que substitui GetHashCode()
-
22-09-2019 - |
Pergunta
Eu tenho uma classe A que implementa IEquatable<>, usando seus campos (digamos, A.b e A.c) para implementar/substituir Equals() e substituir GetHashCode(), e tudo funciona bem, 99% das vezes.A classe A faz parte de uma hierarquia (classe B, C) que herda da interface D;todos eles podem ser armazenados juntos em um dicionário Dictionary, portanto, é conveniente quando todos carregam seus próprios Equals()/GetHashCode() padrão.
No entanto, ao construir A, às vezes preciso fazer algum trabalho para obter os valores de A.b e A.c;enquanto isso acontece, quero armazenar uma referência à instância que está sendo construída.Nesse caso, não quero usar as substituições padrão Equals()/GetHashCode() fornecidas por A.Assim, eu estava pensando em implementar um ReferenceEqualityComparer, que visa forçar o uso de Equals()/GetHashCode() do objeto:
private class ReferenceEqualityComparer<T> : IEqualityComparer<T>
{
#region IEqualityComparer<T> Members
public bool Equals(T x, T y)
{
return System.Object.ReferenceEquals(x, y);
}
public int GetHashCode(T obj)
{
// what goes here? I want to do something like System.Object.GetHashCode(obj);
}
#endregion
}
A questão é: como A substitui Object.GetHashCode(), como posso (fora de A) chamar Object.GetHashCode() para uma instância de A?
Uma maneira, claro, seria A não implementar IEquatable<> e sempre fornecer um IEqualityComparer<> para qualquer dicionário que eu criar, mas espero uma resposta diferente.
Obrigado
Solução
A combinação natural para object.ReferenceEquals
é RuntimeHelpers.GetHashCode
.
Veja a resposta a esta pergunta para obter detalhes completos e uma implementação de ObjectReferenceEqualityComparer<T>
: Construídas em IEqualityComparer<T>
que usa ReferenceEquals
Outras dicas
Chame a implementação básica do CLR via interoperabilidade: Implementação padrão para Object.GetHashCode()