2011-11-15 11 views
7

Estoy buscando la capacidad de convertir métodos completos en árboles de expresión. Escribirlo sería una mierda. :)Buscando un compilador de expresión de C# => Linq

Así (ejemplo trivial) dado el siguiente texto:

public static int Add(int a, int b) 
{ 
    return a + b; 
} 

Quiero obtener ya sea un objeto en memoria que representa esto, o el siguiente texto:

ParameterExpression a = Expression.Parameter(typeof(int), "a"); 
ParameterExpression b = Expression.Parameter(typeof(int), "b"); 
var expectedExpression = Expression.Lambda<Func<int, int, int>>(
     Expression.Add(a,b), 
     a, 
     b 
    ); 

Cualquier ideas? ¿Alguien ha hecho algo con Roslyn que pueda hacer esto?

EDIT: Aclaración: Quiero chupar cualquier método C# (por ejemplo, el de arriba) como texto, y producir una expresión resultante. Básicamente estoy buscando compilar cualquier método de C# dado en árboles de Expresión.

Respuesta

8

Sí Roslyn puede hacer, pero Roslyn tiene su propio árbol de expresión (se les llama árboles de sintaxis), Roslyn herramientas le permiten cargar y ejecutar expresiones o declaraciones.

Tendrá que escribir su propio árbol de sintaxis para convertir el árbol de sintaxis de Roslyn a su árbol de expresiones, pero es posible que todo no se ajuste correctamente.

+0

Pensé que Roslyn puede hacerlo. ¿Conoces alguna fuente existente que ya lo haya hecho? Estoy buscando algo disponible. – Shlomo

+0

Roslyn está fuera solo por un mes, creo que tomará algún tiempo porque la gente escribirá y experimentará con él. Pero es posible que tenga algo en código complejo para el compilador de expresiones usando ironía, etc. Creo que en algún momento la gente publicará proyectos en código plex para Roslyn o puede comenzar uno y pedirle a la gente que contribuya y se construirá a partir de ahí. –

0

Los árboles de expresiones no se generan durante el tiempo de ejecución a partir de Expression so lambdas (lo que significa que su primera declaración de adición no se puede recuperar de su ejecutable como árbol de expresiones). Sin embargo, puede usar el código DOM en el código C# (no el ejecutable) y crear un traductor desde el DOM a un árbol de expresiones.

+0

Todo lo contrario: los árboles de expresión * se * generan en el momento de la ejecución. Cuando el compilador ve una expresión lambda con un tipo de destino de un árbol de expresiones, emite IL para construir un árbol de expresiones en tiempo de ejecución. También puede escribir el código C# para construir un árbol de expresiones, como se muestra en la pregunta. –

+0

Me disculpo, ya que puedo haber malinterpretado lo que tenía la intención de transmitir. No excluyo 'Expression's o lambdas reales, sino simplemente declaraciones regulares, como decir' var a = 1 + 2; '. Tales declaraciones no tienen la forma de árboles de expresión en tiempo de ejecución. – doctorless

+0

Pero las expresiones lambda pueden convertirse en árboles de expresiones de modo que el árbol de sintaxis abstracta se represente * por * un árbol de expresiones en tiempo de ejecución. Todavía no está claro a qué se refiere. Sugiero que edite su respuesta para aclarar. –

1

Por qué no:

Expression<Func<int,int,int>> expr = (a,b) => a + b; 
+0

Aclararé mi pregunta. Quiero una función que pueda escanear el texto del método anterior y producir el texto para construir el árbol Expresión o el objeto del árbol Expresión. – Shlomo

Cuestiones relacionadas