C # .NET 3.5: для чего используется выражение <>? - PullRequest
9 голосов
/ 15 сентября 2009

Для чего конкретно используется выражение <> в C #? Существуют ли сценарии, в которых вы бы сами создавали Expression <> как объект? Если да, приведите пример!

Спасибо!

Ответы [ 3 ]

8 голосов
/ 15 сентября 2009

Expression<T> почти полностью используется для LINQ, но не имеет . В LINQ он обычно используется для «захвата» логики, выраженной в коде, но для хранения ее в данных. Затем эти данные могут быть проверены поставщиком LINQ и обработаны соответствующим образом - например, путем преобразования его в SQL. Обычно деревья выражений в LINQ создаются компилятором из лямбда-выражений или выражений запросов, но в других случаях может быть удобно использовать API напрямую.

Несколько примеров других мест, где я его использовал и видел, как оно использовалось:

  • В MiscUtil Марк Гравелл использовал его для реализации «универсальной арифметики» - если у типа есть соответствующий оператор, он может использоваться в общем.
  • В UnconstrainedMelody Я использовал его аналогичным образом для выполнения операций над перечислениями флагов, независимо от их базового типа (что сложнее, чем вы могли ожидать, из-за long и ulong, имеющих разные диапазоны)
  • В Visual LINQ Я использовал выражения запросов для «оживления» LINQ, чтобы вы могли видеть, что происходит. Хотя очевидно, что это использование LINQ, это не традиционная форма перевода логики в другую форму.
4 голосов
/ 15 сентября 2009

С точки зрения LINQ, есть вещи, которые вы можете сделать для создания более универсальных запросов LINQ во время выполнения, чем вы можете просто в lambdas.

Я много раз использовал Expression в качестве микрокомпилятора, в качестве альтернативы DynamicMethod и IL. Этот подход усиливается в .NET 4.0 (, как обсуждалось в InfoQ ), но даже в 3.5 есть лотов вещей, которые вы можете сделать (обычно на основе данных времени выполнения; конфигурации и т. Д.):

Я также использовал его как часть математического движка для какой-то работы, которую я проделал с Microsoft, то есть для анализа математического выражения ("(x + 12) * y = z" и т. Д.) В дереве Expression, компиляции и запустить его.

Другое интересное использование (проиллюстрировано Джейсоном Боком, здесь ) - в генетическом программировании; создайте своих кандидатов в виде Expression деревьев, и у вас есть необходимый код для их быстрого выполнения (после Compile()), но, что важно, (для генетического программирования), а также для обмена фрагментами.

0 голосов
/ 15 сентября 2009

Посмотрите на мой код до и после в мой ответ на другой вопрос SO .

Резюме: Expression<> значительно упростил код, упростил понимание и даже исправил фантомную ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...