2010-07-17 16 views

Respuesta

25

Los árboles de expresiones tienen mucho en común con (por ejemplo) un AST. No se asigna directamente al código, pero es muy fácil de construir a partir de algoritmos. Por ejemplo, si se está analizando una fórmula:

((a + 2)/b) 

es decir:

ParameterExpression a = ..., b = ... 
var body = Expression.Divide(
    Expression.Add(a, Expression.Constant(2)), 
    b); 
var lambda = Expression.Lambda(body,a,b); // optionally with generics 

De hecho, me han hecho exactamente esto, usando un analizador que construir un árbol de objetos, con la generación de objetos la expresión completa a través de una implementación de "visitante". En .NET 4.0, la compatibilidad más rica con el árbol de expresiones hace posible admitir la mayoría de los escenarios y compilarlos según demanda.

Otro uso de las expresiones clave es que se puede deconstruir en tiempo de ejecución, por lo en el código es posible que tenga:

Foo(x => x.SomeMethod(1, "abc")); 

y extraer el SomeMethod método de información, y 1"abc" etc.


CodeDOM asigna al código . Se trata de sentencias, etc., muy, similar a cómo escribirías el código normal. El uso más común de coddedom es para la generación de código, como parte de las herramientas. Usted puede usarlo para la compilación dinámica, pero para ser honesto, es más difícil. No soy un fan La buena característica es que un árbol codificado podría funcionar en para varios idiomas.


Otro contendiente aquí debe ser DynamicMethod y/o ILGenerator. Este no incluye en una AST (expresión) y no se puede usar para generar código fuente (codificado), pero permite el acceso completo a las herramientas MSIL. Por supuesto, también requiere que piense en términos de pilas, etc., pero es muy eficiente y efectivo para meta-programación.


Si es demasiado ILGenerator núcleo duro, y CodeDOM es un PITA, a continuación, otra opción es la generación de tiempo de ejecución de código como una cadena. Luego, pase eso a través del CSharpCodeProvider para compilarlo. Hay partes del tiempo de ejecución del núcleo que hacen esto (XmlSerializer IIRC).


Entonces, para resumir:

  • meta-programación: ILGenerator o CSharpCodeProvider; También Expression en 4.0 (pero esto es bastante limitada en 3.5)
  • manejo de AST: Expression
  • análisis en tiempo de ejecución: Expression
  • de generación de código en varios idiomas: Código-dom
0

Los árboles de expresiones se utilizan para generar expresiones. Creando código fuente en tiempo de ejecución. CodeDom se utiliza para compilar el código fuente. Tiene que existir antes de que puedas construirlo. Los árboles de expresión son más flexibles, pero mucho más difíciles de usar.

Si desea agregar scripts a su aplicación, use CodeDom. Si quieres hacer una reflexión muy avanzada y lo que te gusta, usa árboles de expresión, pero no lo recomiendo.

Cuestiones relacionadas