Переопределение Equals для классов со многими свойствами в C # - PullRequest
5 голосов
/ 30 августа 2011

У меня есть несколько классов данных, которые имеют более 25 свойств различных типов значений (и это может измениться в будущем при изменении требований).Я хотел бы переопределить equals, в основном для целей модульного тестирования.

В настоящее время единственный способ, которым я знаю, как это сделать, - это фактически проверить на равенство каждого свойства, жестко закодированного.Это кажется плохим по двум причинам - во-первых, мне придется написать много кода, чтобы проверить 25 свойств на равенство, - во-вторых, если свойство в одном из классов будет добавлено позднее, метод Equals не будет проверятьчто, и, скорее всего, это останется незамеченным и приведет к проблемам в будущем.

Поскольку Equals обычно проверяет свойства классов, должен быть способ динамического сравнения свойств сравниваемых классов, которыйгарантирует, что изменения свойств класса не приведут к неправильной реализации Equals.Есть ли способ сделать это?

Ответы [ 5 ]

4 голосов
/ 30 августа 2011

вы можете написать что-то вроде этого, используя рефлексию - но это будет очень медленно.Я бы придерживался преобладающих равных, но подумал, какая часть вам действительно нужна для равных.Обычно я проверяю неизменяемость частей (например, Id) на равенство и просто игнорирую изменяемые поля, и я думаю, что это хорошая практика.

1 голос
/ 30 августа 2011

Может быть, Т4 может помочь вам.С его помощью вы можете генерировать код одним щелчком мыши.В рамках этой функции вы можете использовать механизм медленного отражения для создания жестко запрограммированной GetHashCode () функции, которая будет вызываться во время выполнения.Для первого взгляда на T4 взгляните на блог Scotts об этом.Или просто попробуйте поискать Text Template Transformation Toolkit с вашей любимой поисковой системой.

1 голос
/ 30 августа 2011

Вы можете использовать некоторые AOP Frameworks . Если свойства, которые вы хотите сравнить, намного больше, чем те, которые вы хотите избежать, отметьте свойства, которые нужно пропустить, с помощью специального пользовательского атрибута.

1 голос
/ 30 августа 2011

Если ваш класс является сущностью, он должен иметь свойство, позволяющее уникально идентифицировать каждый экземпляр.

Если ваш класс реализован как тип значения, вам придется проверять равенство, проверяя каждое свойство. В последнем случае, чтобы предотвратить утомительную работу, вы можете использовать отражение, чтобы получить все свойства класса во время выполнения, получить значение и использовать классы TypeDescriptor для сравнения значений.

1 голос
/ 30 августа 2011

Попробуйте использовать отражение, чтобы сравнить свойства. Смотрите Сравнение свойств объекта в c # для получения дополнительной информации!

...