C # .NET 3.5:Что такое Экспрессия<> используется для?

StackOverflow https://stackoverflow.com/questions/1425279

  •  07-07-2019
  •  | 
  •  

Вопрос

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

Спасибо!

Это было полезно?

Решение

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

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

  • В Неправильно использованный, Марк Гравелл использовал его для реализации "универсальной арифметики" - если тип имеет соответствующий оператор, его можно использовать в общем виде.
  • В Непринужденная мелодия Я использовал его аналогичным образом для выполнения операций с перечислениями flags, независимо от их базового типа (что сложнее, чем вы могли бы ожидать, из-за long и ulong имеющие разные диапазоны)
  • В Визуальный LINQ Я использовал выражения запросов для "анимации" LINQ, чтобы вы могли видеть, что происходит.Хотя очевидно, что это использование LINQ, это не традиционная форма перевода логики в другую форму.

Другие советы

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

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

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

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

Взгляните на мою перед & amp; после кода в моем ответе на другой вопрос SO .

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top