Забавно, что вы должны спросить, я недавно опубликовал код для выполнения именно этого. Проверьте мой MemberwiseEqualityComparer , чтобы увидеть, соответствует ли он вашим потребностям.
Это действительно удобно и довольно эффективно. Он использует IL-emit для генерации всей функции Equals и GetHashCode при первом запуске (один раз для каждого используемого типа). Он будет сравнивать каждое поле (частное или общедоступное) данного объекта с помощью средства сравнения по умолчанию для этого типа (EqualityComparer.Default). Некоторое время мы использовали его в производстве, и он кажется стабильным, но я не оставлю никаких гарантий =)
Он заботится обо всех тех крайних случаях, о которых вы редко думаете, когда вы катите свой собственный метод equals (то есть вы не можете сравнить свой собственный объект с нулем, если вы сначала не поместили его в объект и многие другие вопросы, связанные с нулями).
Я намеревался написать в блоге об этом, но еще не дошел до этого. Код немного недокументирован, но если вам понравится, я могу немного его почистить.
public override int GetHashCode()
{
return MemberwiseEqualityComparer<Foo>.Default.GetHashCode(this);
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
return Equals(obj as Foo);
}
public override bool Equals(Foo other)
{
return MemberwiseEqualityComparer<Foo>.Default.Equals(this, other);
}
MemberwiseEqualityComparer выпускается под лицензией MIT , что означает, что вы можете делать с ним практически все, что захотите, в том числе использовать его в проприетарных решениях, не меняя лицензию.