Как заставить объекты «предполагать», что они получили перегрузку для оператора X?

StackOverflow https://stackoverflow.com/questions/1078959

Вопрос

Есть ли способ заставить компилятор C# игнорировать отсутствующие перегрузки операторов для объектов и вместо этого обрабатывать эту проверку во время выполнения?Я спрашиваю, потому что у меня есть контейнер, содержащий несколько объектов с различными атрибутами типа int, string, ushort и т. д.Я создаю функцию поиска для этого контейнера и хотел бы иметь возможность поиска по различным полям.

Я использую предикаты и лямбда-выражения.

Это то, что я хочу:

var data = container.Retrieve(ID => (ID == 5), Date => (Date > somedate));

предполагая, что ID и Date являются полями в объектах контейнера

Вот что мне нужно сделать сегодня (хотя это работает):

var data = container.Retrieve(ID => ((int)ID == 5), Date => ((DateTime)Date > somedate));

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

Есть ли способ сделать это?

Это было полезно?

Решение

Нет, в C# 3.0 нет поддержки операторов без знания типа.

В С# 4.0 вы можете сделать это с помощью dynamic, но это медленнее.

В вашем случае вы знать какими должны быть типы - так что просто приведите (как вы).


В более общем случае:

Для неизвестных типов посмотрите Comparer.Default.Compare и object.Equals...

С дженериками;посмотри на Comparer<T>.Default.Compare(x,y) - это должно делать все, что вам нужно для >,>=,< и <= (включая нули и т. д.).Так же EqualityComparer<T>.Default.Equals(x,y) ручки == и != (включая нули и т. д.).

Для большего количества операторов (+,-,* и т. д.) - посмотрите РазноеUtil

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top