Как заставить объекты «предполагать», что они получили перегрузку для оператора X?
-
21-08-2019 - |
Вопрос
Есть ли способ заставить компилятор 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