¿Cómo verificar rápidamente si dos objetos de transferencia de datos tienen propiedades iguales en C #?

Tengo estos objetos de transferencia de datos:

public class Report 
{
    public int Id { get; set; }
    public int ProjectId { get; set; }
    //and so on for many, many properties.
}

No quiero escribir

public bool areEqual(Report a, Report b)
{
    if (a.Id != b.Id) return false;
    if (a.ProjectId != b.ProjectId) return false;
    //Repeat ad nauseum
    return true;
}

¿Existe una forma más rápida de probar si dos objetos con solo propiedades tienen los mismos valores (algo que no requiere una línea de código o una expresión lógica por propiedad?)

Cambiar a estructuras no es una opción.

Respuestas a la pregunta(10)

Su respuesta a la pregunta