Есть ли способ заставить компилятор С# игнорировать отсутствующие перегрузки операторов для объектов и вместо этого обрабатывать эту проверку во время выполнения? Я спрашиваю, потому что у меня есть контейнер, который имеет несколько объектов, которые имеют различные атрибуты типа int, string, ushort и т.д. Я создаю функцию поиска для этого контейнера и хочу иметь возможность выполнять поиск по различным полям.
Я использую предикаты и лямбда-выражения.
Это то, что я хочу:
var data = container.Retrieve(ID => (ID == 5), Date => (Date > somedate));
Предполагая, что идентификатор и дата являются полями в объектах контейнера
Это то, что я должен делать сегодня (это работает, хотя):
var data = container.Retrieve(ID => ((int)ID == 5), Date => ((DateTime)Date > somedate));
Это дополнительное кастинг не очень хорошо выглядит по сравнению с первым примером, я бы не хотел этого делать. Я бы хотел иметь возможность проверить это во время выполнения.
Есть ли способ сделать это?
Нет, С# 3.0 не поддерживает операторов, не зная тип.
В С# 4.0 вы можете сделать это с помощью dynamic
, но он медленнее.
В вашем случае вы знаете, какими должны быть типы - так просто выполняйте (как и вы).
В более общем случае:
С неизвестными типами посмотрите Comparer.Default.Compare
и object.Equals
...
С дженериками; посмотрите Comparer<T>.Default.Compare(x,y)
- это должно сделать все, что вам нужно для >
, >=
, <
и <=
(включая нули и т.д.). Аналогично EqualityComparer<T>.Default.Equals(x,y)
обрабатывает ==
и !=
(включая нули и т.д.).
Для большего числа операторов (+
, -
, *
и т.д.) - посмотрите MiscUtil