Где разместить функцию равенства для класса в сторонней библиотеке?

Я использую стороннюю библиотеку, содержащую класс, в котором отсутствуют как operator == (), так и Equals (). Я бы хотел реализовать один сам, но не знаю, как его назвать и куда поставить. Я попытался добавить оба оператора в качестве метода расширения, но оба потерпели неудачу. Я написал функцию IsEqualTo (), но это приводит к довольно запутанному клиентскому коду. Кто-нибудь знает более изящное решение?


person Dimitri C.    schedule 18.02.2011    source источник


Ответы (2)


Будет ли это вариант унаследовать от стороннего класса или обернуть его?

person Daniel Hilgarth    schedule 18.02.2011
comment
Хм, я сомневаюсь, что это сделало бы клиентский код более понятным, поскольку мне всегда приходилось не забывать обертывать экземпляр перед вызовом функции сравнения, точно так же, как теперь мне нужно не забыть вызвать мою собственную функцию IsEqualTo () вместо функций сравнения по умолчанию . - person Dimitri C.; 18.02.2011
comment
Я имел в виду: не используйте сторонний класс в своем коде. Всегда используйте свою обертку. - person Daniel Hilgarth; 18.02.2011
comment
Действительно, это был бы вариант, но для этого потребовалось бы преобразовывать экземпляры туда и обратно при взаимодействии с библиотекой. Хотя это возможно, это приводит к большим накладным расходам. - person Dimitri C.; 18.02.2011

Вы не сможете перегрузить оператор ==, но можете создать IEqualityComparer<T>, который можно использовать для словарей и т. Д.

Хотя вы можете написать метод расширения Equals, он никогда не будет использоваться, потому что виртуальный метод на Object будет всегда применим, и если существует применимый метод экземпляра, компилятор не ищет методы расширения, даже если есть более конкретный.

Возможно, вы захотите переименовать свой метод IsEqualTo в ValueEquals или что-то подобное ... но я согласен, что это все еще не идеально.

person Jon Skeet    schedule 18.02.2011