У меня такое чувство, что после прочтения документации ответ - нет.Однако я пытаюсь выяснить, возможно ли узнать, поддерживает ли тип реляционные операторы, такие как: <,>,> = etc ...
Я ищу что-то вроде:
Func<MyObject, object> greaterThan = obj => obj > 10;
var results = myList.Where(greaterThan).ToList();
Поскольку я могу искать по разным свойствам, это может быть десятичное число, целое число или число с плавающей запятой.Я делаю это в действии MVC, поэтому, насколько я знаю, он не может поддерживать дженерики.Я, очевидно, могу переместить его и получить универсальную реализацию, но я хотел бы сначала узнать этот ответ.
Чтобы уточнить, неявная перегрузка операторов невозможна.Причина в том, что свойство не известно до времени выполнения (извините, я должен был упомянуть).Следовательно, и дженерики не могут быть использованы.Для любого свойства мне нужно убедиться, что оно не равно 0. Это несколько надуманный пример моей текущей реализации, которая работает (не полностью протестирована):
Func<MyObject, IComparable> prop = obj => isOn ? obj.DecimalVal : obj.IntValue;
Func<MyObject, bool> clause = obj => prop(obj).CompareTo(0) != 0;
var results = myList.Where(clause);
Я просто надеюсь, что CompareToвернет 0;даже если реквизит оценивает десятичное число со значением 0 по сравнению с int 0 - несмотря на то, что это разные типы.
ОБНОВЛЕНИЕ
У меня явно были слишком большие надежды, вышеуказанный подход не удался.Поэтому решение, которое я использую сейчас, нежелательно, но оно работает.Я хотел бы услышать более элегантный подход.
Func<MyObject, dynamic> prop = obj => isOn ? obj.DecimalVal : obj.IntValue;
Func<MyObject, bool> clause = obj => prop(obj) != 0;
var results = myList.Where(clause);