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

2

Есть ли способ заставить компилятор С# игнорировать отсутствующие перегрузки операторов для объектов и вместо этого обрабатывать эту проверку во время выполнения? Я спрашиваю, потому что у меня есть контейнер, который имеет несколько объектов, которые имеют различные атрибуты типа 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));

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

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

Теги:
lambda
operator-overloading
predicate

1 ответ

3
Лучший ответ

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

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

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


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

С неизвестными типами посмотрите Comparer.Default.Compare и object.Equals...

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

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

  • 0
    Хорошо, тогда я буду жить со своими слепками. Приветствия за быстрый ответ. :)
  • 0
    @Hallgeir: Если вы используете свои собственные объекты или можете извлечь их из них, вы можете использовать неявную перегрузку оператора приведения. Не уверен, что это можно применить к вашей ситуации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню