все зависит от задачи:
как именно сравнивать: рекурсивно, нерекурсивно
что выдавать в результате: имена свойств, PropertyInfo, PropertyDescriptor
если особых требований к быстродействию нет, то можно написать через рефлексию универсальный сравниватель, в том числе и рекурсивный.
В простейшем случае, нерекурсивный вариант, который сравнивает свойства с простыми типами по значению, а ссылочные по ссылке, и выдает имена различающихся свойств:
static IEnumerable<string> Compare<T>(T a, T b)
where T : class
{
return typeof(T)
.GetProperties()
.Where(pi => !pi.GetValue(a, null).Equals(pi.GetValue(b, null)))
.Select(pi=>pi.Name);
}