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

Foi útil?

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()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top