2013-07-31 25 views
21

Bunu yapmak için temiz bir yol var mı?LambdaExpression'u çalıştırın ve nesne olarak geri dönüş değeri alın

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" 

Bu, farklı türler için çalışmalıdır.

+0

Neden sadece 'var fonk = new Func (x => {String.format return ("My int = {0}", x);});'? – PoweredByOrange

+1

@PoweredByOrange Sorunun sadeleştirildiğini farz ediyorum. – Kevin

+0

@Kevin Anlamsızlaştırır, aksi takdirde basit bir 'string.Format()' yapardı :) – PoweredByOrange

cevap

29

Tabii ... sadece

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

Styxxy mükemmel bir noktaya getirir ... Sen en iyisi dışarı derleyici yardım sağlayarak hizmet olacağını ... onu çağırmak sonra lambda derlemek ve gerek . Aşağıdaki koddaki gibi derlenmiş bir ifadeyle not alın ve sonuçta her ikisi de yazılır.

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

'compiledLambda.Invoke (input);' türünün tam olarak @Styxxy işaretli olması durumunda daha iyi bir seçenek olabilir. "Invoke" daha az yansıma nedeniyle "DynamicInvoke" den daha hızlıdır, bkz. Http://stackoverflow.com/questions/12858340/difference-between-invoke-and-dynamicinvoke –

İlgili konular