Сделайте реализации интерфейса сопоставимыми с == - PullRequest
2 голосов
/ 19 ноября 2011

У меня есть класс Product : IProduct. Весь код, который использует продукты, работает с интерфейсами, реализация интерфейса обеспечивается внутренним DI-контейнером. Что мне нужно добавить к интерфейсу и классу, чтобы я мог написать такой код:

IProduct defectiveSku;

IProduct customerSku;

....

if(customerSku == devectiveSku)

{

// refund, blame someone else

}

еще

{

// scare the customer away

}

Ответы [ 2 ]

4 голосов
/ 19 ноября 2011

Вы можете использовать интерфейс IEquatable<T>:

interface IProduct : IEquatable<IProduct> { ... }

Но вам придется сравнить с методом Equals:

if (customerSku.Equals(defectiveSku)) ...

Сравнение с Equalsлучше для сущности, такой как IProduct, потому что она лучше передает семантику равенства сущностей , чем оператор ==;который обычно передает ссылочное равенство или значение равенства .

1 голос
/ 19 ноября 2011

Как уже отмечали другие, я подозреваю, что вы действительно хотите перегрузить Object.Equals (Object) или IEquatable.Equals (T), но, поскольку у вас есть контейнер DI, реализующий классы, у вас могут возникнуть проблемы с этим, так как DI Контейнер (или предоставленная реализация) должен знать, как реализовать сравнение. Если случайно вы используете Castle Windsor, вы можете сделать это с помощью пользовательского перехватчика, аналогично реализации INotifyPropertyChanged здесь: http://www.hightech.ir/SeeSharp/Best-Implementation-Of-INotifyPropertyChange-Ever

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...