2013-07-31 10 views
21

Esiste un modo pulito per eseguire questa operazione?Esegui LambdaExpression e ottieni il valore restituito come oggetto

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" 

questo dovrebbe funzionare per diversi tipi.

+0

Perché non solo 'var func = new Func (x => {return string.Format ("Il mio int = {0}", x);});'? – PoweredByOrange

+1

@PoweredByOrange Suppongo che la domanda sia semplificata. – Kevin

+0

@Kevin Ha senso, altrimenti un semplice 'string.Format()' lo farebbe :) – PoweredByOrange

risposta

29

Certo ... si solo bisogno di compilare il lambda e poi richiamarlo ...

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

Styxxy porta in primo piano un ottimo punto ... sarebbe meglio servito lasciando l'aiuto compilatore fuori . Nota con un'espressione compilata come nel codice qui sotto input e result sono entrambi fortemente digitati.

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

'compiledLambda.Invoke (input);' potrebbe essere una scelta migliore qui se il tipo esatto è noto come @Styxxy sottolineato. 'Invoke' è più veloce di' DynamicInvoke' a causa di una minore riflessione in corso, vedi http://stackoverflow.com/questions/12858340/difference-between-invoke-and-dynamicinvoke –

Problemi correlati