C # .NET 3.5:Что такое Экспрессия<> используется для?
-
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 < >
значительно упростило код, упростило его понимание и даже исправило фантомную ошибку.