Нужно ли указывать имена свойств в виде строк, а не напрямую?
Вы можете написать собственную реализацию IEqualityComparer<T>
, которая принимает проекцию, а затем также дать ейAndAlso
метод для получения другой проекции.У меня есть первая часть в MiscUtil , а остальные не должны быть слишком сложными в использовании.
Вы бы использовали это примерно так:
// The first argument here is only for the sake of type inference
var comparer = PropertyEqualityComparer.WithExample(p1, p => p.First)
.AndAlso(p => p.Last);
bool equal = comparer.Equals(p1, p2);
или:
var comparer = PropertyEqualityComparer<Person>.Create(p1, p => p.First)
.AndAlso(p => p.Last);
bool equal = comparer.Equals(p1, p2);
К сожалению, вы не можете использовать params
здесь, так как вы вполне можете захотеть, чтобы у каждой проекции был другой тип цели.
(Вы хотите создать один компаратор дляпо возможности каждый сценарий.)