Деревья выражений имеют много общего с (например) AST .Он не отображается непосредственно на код, но очень поддается построению из алгоритмов.Например, если вы анализируете формулу:
((a + 2) / b)
, то есть:
ParameterExpression a = ..., b = ...
var body = Expression.Divide(
Expression.Add(a, Expression.Constant(2)),
b);
var lambda = Expression.Lambda(body,a,b); // optionally with generics
На самом деле, я сделал точно , используя парсер, которыйпостроить дерево объектов, с объектами, генерирующими полное выражение через реализацию "посетителя".В .NET 4.0 расширенная поддержка дерева выражений позволяет поддерживать большинство сценариев и компилировать их по требованию.
Другое ключевое использование выражений заключается в том, что вы можете деконструировать их во время выполнения, поэтому в вашем коде вы можете иметь:
Foo(x => x.SomeMethod(1, "abc"));
и извлечь SomeMethod
method-info, 1
и "abc"
и т. д.
*Код 1025 * отображается на
код .Это все об операторах и т. Д.,
очень похоже на то, как вы пишете обычный код.Наиболее распространенное использование кодирования для генерации кода, как часть инструментов.Вы
можете использовать его для динамической компиляции, но, честно говоря, это сложнее.Я не фанат.Приятной особенностью является то, что кодовое дерево
может работать для нескольких языков.
Другой претендент здесь должен быть DynamicMethod
и / или ILGenerator
.Это не сопоставляется с AST (выражением) и не может использоваться для генерации исходного кода (кодирования), но обеспечивает полный доступ к инструментам MSIL.Конечно, это также требует, чтобы вы думали с точки зрения стеков и т. Д., Но это очень эффективно и эффективно для метапрограммирования.
Если ILGenerator
слишком сложноядро и кодирование - это PITA, затем другой вариант - генерация кода во время выполнения в виде строки .Затем передайте это через CSharpCodeProvider
, чтобы скомпилировать.Есть части ядра времени выполнения, которые делают это (XmlSerializer
IIRC).
Итак, подведем итог:
- метапрограммирование:
ILGenerator
или CSharpCodeProvider
;также Expression
в 4.0 (но это довольно ограничено в 3.5) - обработка AST:
Expression
- синтаксический анализ во время выполнения:
Expression
- генерация кода внесколько языков: код-дом