¿Forma concisa de combinar hashcodes de campo?

Una si las formas de implementar GetHashCode, donde se requiere que lo haga, se describen por Jon Skeetaquí. Repitiendo su 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 este código a mano puede ser propenso a errores y los errores pueden ser sutiles / difíciles de detectar (¿intercambió+ y* ¿por error?), puede ser difícil recordar las reglas de combinación para diferentes tipos, y no me gusta gastar un esfuerzo mental en escribir / revisar lo mismo una y otra vez para diferentes campos y clases. También puede ofuscar uno de los detalles más importantes (¿recordé incluir todos los campos?) En ruidos repetitivos.

¿Hay una forma concisa de combinar códigos hash de campo usando la biblioteca .net?. Obviamente, podría escribir el mío, pero si hay algo idiomático / incorporado, preferiría eso.

Como ejemplo, en Java (usando JDK7) puedo lograr lo anterior usando:

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

Esto realmente ayuda a eliminar errores y centrarse en los detalles importantes.

Motivación: me encontré con una clase de C # que requiere un reemplazoGetHashCode(), pero la forma en que combinaba los códigos hash de sus diversos componentes tenía algunos errores graves. Una función de biblioteca para combinar los hashcodes sería útil para evitar este tipo de errores.

Respuestas a la pregunta(5)

Su respuesta a la pregunta