С точки зрения LINQ, есть вещи, которые вы можете сделать для создания более универсальных запросов LINQ во время выполнения, чем вы можете просто в lambdas.
Я много раз использовал Expression
в качестве микрокомпилятора, в качестве альтернативы DynamicMethod
и IL. Этот подход усиливается в .NET 4.0 (, как обсуждалось в InfoQ ), но даже в 3.5 есть лотов вещей, которые вы можете сделать (обычно на основе данных времени выполнения; конфигурации и т. Д.):
Я также использовал его как часть математического движка для какой-то работы, которую я проделал с Microsoft, то есть для анализа математического выражения ("(x + 12) * y = z" и т. Д.) В дереве Expression
, компиляции и запустить его.
Другое интересное использование (проиллюстрировано Джейсоном Боком, здесь ) - в генетическом программировании; создайте своих кандидатов в виде Expression
деревьев, и у вас есть необходимый код для их быстрого выполнения (после Compile()
), но, что важно, (для генетического программирования), а также для обмена фрагментами.