Como verificar rapidamente se dois objetos de transferência de dados têm propriedades iguais em c #?

Tenho estes objetos de transferência de dados:

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

Eu não quero escrever

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;
}

xiste uma maneira mais rápida de testar se dois objetos com apenas propriedades têm os mesmos valores (algo que não requer uma linha de código ou uma expressão lógica por propriedade

Alternar para estruturas não é uma opçã