Всем привет.
Взглянул я тут на код StructuralEquality. Он дремучий и кривой. Данный макрос не реализует метод GetHashCode и всегда используется код "x.GetType().Equals(this.GetType())", что замедляет реализацию (особенно для структур).
Кроме того этот макрос не реализует интерфейсы IEquatable[T] и IStructuralEquatable.
Предлагаю кому-нибудь взяться за реализацию новой версии данного макроса, или даже лучше ряда макросов предоставляющую реализацию эквивалентности "из коробки".
Требования к новой реализации макроса:
1. Реализация интерфейсов IEquatable[T] и IStructuralEquatable.
2. Реализация методов Equals (типизированной) и GetHashCode.
3. Реализация макро-атрибута IgnoreInEquals (имя можно подобрать и получше).
4. Предоставление замены для "x.GetType().Equals(this.GetType())". Для структур этот код вообще не должен появляться, для класса должна быть настройка позволяющая опустить эту проверку. Кроме того такая проверка должна устраняться, если класс помечен модификатором sealed.
Кроме того предлагаю так же реализовать макрос реализующий IEqualityComparer[T] для заданного типа. Применять его так же имеет смысл к классу, но это будет класс компаратора. Сравниваемый же тип должен передаваться макросу в качестве параметра. Как вариант, можно реализовать макро-атрибут уровня сборки.
[ImplementIEqualityComparer(MyType)]
class MyTypeEqualityComparer { }
// или
[assembly: ImplementIEqualityComparer(MyType)]
Задача не сложная, но интересная.