2013-07-31 11 views
21

Czy jest na to czysty sposób?Wykonaj LambdaExpression i uzyskaj zwróconą wartość jako obiekt

Expression<Func<int, string>> exTyped = i => "My int = " + i; 
LambdaExpression lambda = exTyped; 

//later on: 

object input = 4; 
object result = ExecuteLambdaSomeHow(lambda, input); 
//result should be "My int = 4" 

To powinno działać dla różnych typów.

+0

Dlaczego nie po prostu 'var func = new Func (x => {return string.Format ("Mój int = {0}", x);});'? – PoweredByOrange

+1

@PoweredByOrange Zakładam, że pytanie jest uproszczone. – Kevin

+0

@Kevin ma sens, w przeciwnym razie wystarczy prosty 'string.Format()' :) – PoweredByOrange

Odpowiedz

29

Jasne ... wystarczy skompilować lambda, a następnie wywołać ją ...

object input = 4; 
var compiledLambda = lambda.Compile(); 
var result = compiledLambda.DynamicInvoke(input); 

Styxxy wywołuje doskonały punkt ... Użytkownik będzie lepiej służył pozwalając pomocy kompilatora Ci się . Uwaga ze skompilowanym wyrażeniem jak w poniższym kodzie wejściowym i wynikowym są mocno wpisane.

var input = 4; 
var compiledExpression = exTyped.Compile(); 
var result = compiledExpression(input); 
+0

'compiledLambda.Invoke (input);' może być lepszym wyborem, jeśli dokładny typ jest znany jako @Styxxy wskazany. Wywołanie 'jest szybsze niż' DynamicInvoke' z powodu mniejszej refleksji, patrz http://stackoverflow.com/questions/12858340/difference-between-invoke-and-dynamicinvoke –