2016-12-07 39 views
2

基本上我試圖將兩個lambda表達式與類表達式相乘,但我甚至無法構建並找不到文檔。這裏是我的代碼:將兩個lambda乘以表達式

var f = x=>x+2; 
var g = x=>x+3; 
var argX = Expression.Parameter(typeof(double), "x"); 
var fg = Expression.Multiply(Expression.Constant(g, typeof(Func<double, double>)), Expression.Constant(f, typeof(Func<double, double>))); 
//var fg = Expression.Multiply(Expression.Constant(g),Expression.Constant(f)); 
var lambda = Expression.Lambda<Func<double, double>>(f3, argX); 
return lambda.Compile(); 
+1

它甚至意味着乘以兩個函數?你可以乘*值*,但不能*函數*。 – Servy

+0

如果你只是要將你的表達式編譯成代表,爲什麼要處理表達式呢?只需從一開始就與代表打交道。 – Servy

+0

lambda返回一個值,我想要乘以兩個lambda表達式。基本上我想要的東西像x =>(x + 2)*(x + 3) 處理委託肯定會工作,但根據此主題會慢一點: http://stackoverflow.com/questions/5568294/編譯的c-sharp-lambda-expressions-performance –

回答

3

你想是這樣的:

Expression<Func<double,double>> f = x => x + 2; 
Expression<Func<double,double>> g = x => x + 3; 

var param = Expression.Parameter(typeof(double)); 
var invokeF = Expression.Invoke(f, param); 
var invokeG = Expression.Invoke(g, param); 

var mult = Expression.Multiply(invokeF,invokeG); 

var lambda = ((Expression<Func<double, double>>)Expression.Lambda(mult, param)).Compile(); 

如果我把它叫做這樣:

lambda(3); 

我得到30有效的答案。

+0

我想改變一下lambda行來直接編譯它:'var lambda =(Func )Expression.Lambda(mult,param).Compile();'然後你可以跳過'Compile()當你稍後想要使用它的時候打電話。 – fknx

+0

@fknx是的,謝謝,這樣改變它。 –

0

對於這個簡單的定義fgExpression還有:

var argX = Expression.Parameter(typeof(double), "x"); 

var f = Expression.Add(argX, Expression.Constant(3.0)); // applies to x => x + 3 
var g = Expression.Add(argX, Expression.Constant(2.0)); // applies to x => x + 2 
var fg = Expression.Multiply(f, g); // applies to f(x) * g(x) 
var lambda = Expression.Lambda<Func<double, double>>(fg, argX); 

現在這樣稱呼它:

var r = lambda.Compile()(1); 

它返回12