2016-12-07 35 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