2011-11-15 13 views
7

Sto cercando la possibilità di convertire interi metodi in alberi di espressione. Scriverlo farebbe schifo. :)Cerca C# => Compilatore Linq Expression

So (esempio banale) dato testo:

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

Voglio ottenere sia oggetto in memoria rappresenta questo oppure seguente:

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 
    ); 

Qualsiasi idee? Qualcuno ha forse fatto qualcosa con Roslyn che può farlo?

MODIFICA: Chiarimento: voglio succhiare in qualsiasi metodo C# (ad esempio, quello sopra) come testo e produrre un'espressione risultante. Fondamentalmente sto cercando di compilare qualsiasi dato metodo C# negli alberi di espressione.

risposta

8

Sì Roslyn può fare, ma Roslyn ha il suo albero di espressione (si chiamano alberi di sintassi), strumenti di Roslyn consentono di caricare ed eseguire espressioni o dichiarazioni.

Dovrai scrivere il tuo tree walker per la sintassi per convertire l'albero di sintassi di Roslyn nell'albero delle espressioni, ma tutto potrebbe non adattarsi correttamente.

+0

Ho pensato che Roslyn potesse farlo. Conosci qualche fonte esistente che l'ha già fatto? Sto cercando qualcosa disponibile. – Shlomo

+0

Roslyn è fuori solo per un mese, penso che ci vorrà un po 'perché le persone scriveranno e sperimenteranno con esso. Ma potreste avere qualcosa su code plex per il compilatore di espressioni usando l'ironia, ecc. Credo che in qualche momento le persone pubblicheranno progetti su code plex per Roslyn o ne potremo avviarne uno e chiedere alle persone di contribuire e da lì in poi si costruiranno. –

0

Gli alberi di espressione non vengono generati in fase di esecuzione da qualsiasi altro oltre a Expression s o lambdas (ovvero la prima istruzione aggiuntiva non può essere richiamata dal file eseguibile come albero di espressioni). Tuttavia, è possibile utilizzare il codice DOM sul codice C# (non l'eseguibile) e creare un traduttore dal DOM in un albero di espressioni.

+0

Gli alberi di espressione inversa * sono * generati al momento dell'esecuzione. Quando il compilatore vede un'espressione lambda con un tipo di destinazione di un albero di espressioni, emette IL per costruire un albero di espressioni al momento dell'esecuzione. Puoi scrivere codice C# per costruire anche un albero di espressioni, come mostrato nella domanda. –

+0

Mi scuso, poiché ho potuto erroneamente indicare ciò che intendevo trasmettere. Non escludo l'espressione 'Expression's o lambda, ma solo affermazioni regolari, come ad esempio' var a = 1 + 2; '. Tali dichiarazioni non sono sotto forma di alberi di espressione al momento dell'esecuzione. – doctorless

+0

Ma le espressioni lambda possono essere convertite in alberi di espressione in modo tale che l'albero di sintassi astratto sia rappresentato * da * un albero di espressioni al momento dell'esecuzione. Non è ancora chiaro cosa intendi - ti suggerisco di modificare la tua risposta per chiarire. –

1

Perché non:

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

Chiarirò la mia domanda. Voglio una funzione che possa scansionare il testo del metodo sopra e produrre il testo per costruire l'albero delle espressioni o l'oggetto dell'albero delle espressioni stesso. – Shlomo