Forma concisa de combinar hashcodes de campo?

Um deles, se as maneiras de implementar GetHashCode - onde é necessário fazê-lo - são descritas por Jon SkeetAqui. Repetindo seu código:

public override int GetHashCode()
{
    unchecked // Overflow is fine, just wrap
    {
        int hash = 17;
        // Suitable nullity checks etc, of course :)
        hash = hash * 23 + field1.GetHashCode();
        hash = hash * 23 + field2.GetHashCode();
        hash = hash * 23 + field3.GetHashCode();
        return hash;
    }
}

Rodar esse código manualmente pode ser propenso a erros e os bugs podem ser sutis / difíceis de detectar (você trocou+ e* por engano?), pode ser difícil lembrar as regras de combinação para diferentes tipos, e eu não gosto de gastar esforço mental em escrever / rever a mesma coisa repetidas vezes para diferentes campos e classes. Também pode ofuscar um dos detalhes mais importantes (lembrei-me de incluir todos os campos?) Em ruído repetitivo.

Existe uma maneira concisa de combinar hashcodes de campo usando a biblioteca .net?. Obviamente, eu poderia escrever o meu próprio, mas se há algo idiomático / built-in eu prefiro isso.

Por exemplo, em Java (usando o JDK7) eu posso conseguir o seguinte usando:

   @Override
   public int hashCode()  
   {  
      return Objects.hash(field1, field2, field3);  
   }  

Isso realmente ajuda a eliminar erros e se concentrar nos detalhes importantes.

Motivação: me deparei com uma classe C # que requer uma substituiçãoGetHashCode(), mas a maneira como combinou os hashcodes de seus vários componentes teve alguns erros graves. Uma função de biblioteca para combinar os hashcodes seria útil para evitar tais erros.

questionAnswers(5)

yourAnswerToTheQuestion