Str*_*der 4 .net c# lambda code-generation expression-trees
我第一次探索表达树.我有一些基本的疑虑.
基本上,表达式只接受lambda表达式.然后,我们可以将lambda表达式Compile()编译为MSIL代码,然后返回一个通用委托.我们可以按原样调用返回的委托.我的理解是否正确?
如果它在这里是我想要实现的: ((10*5)+(9/4))
BinaryExpression b1 = Expression.MakeBinary(ExpressionType.Multiply, Expression.Constant(10), Expression.Constant(5));//(10*5)
BinaryExpression b2 = Expression.MakeBinary(ExpressionType.Divide, Expression.Constant(9), Expression.Constant(4));//(9/4)
BinaryExpression b4 = Expression.MakeBinary(ExpressionType.Add, b1, b2);//((10*5)+(9/4))
Run Code Online (Sandbox Code Playgroud)
所以在这一点上我们已经做到了lambda expression body.现在把它变成full lambda expression我们需要打电话的
Console.WriteLine(Expression.Lambda<Func<int, int>>(b4).Compile());
Run Code Online (Sandbox Code Playgroud)
我没有得到这一部分.这也行不通.
为什么这样Func<int,int>?
是否内部表达式只将int作为param,整个表达式将返回一个int?
显然这不起作用.生成的lambda是怎样的?
我正在全面了解情况?如何使这项工作?
Run Code Online (Sandbox Code Playgroud)Expression.Lambda<Func<int, int>>(b4).Compile()
Func<int,int>是lambda的签名,它接受一个int参数,并返回一个int.你的lambda有不同的签名.
显然这不起作用.
你的lambda不带任何参数,所以你需要Func<int>代替.
生成的lambda是怎样的?
生成的lambda是一个可调用的对象.如果你想评估你得到的表达式,演员并调用它,如下所示:
var compiledLambda = (Func<int>)Expression.Lambda<Func<int>>(b4).Compile();
Console.WriteLine(compiledLambda());
// ^^
Run Code Online (Sandbox Code Playgroud)
以上打印52,如预期.
如果你想使一个Func<int,int>,一个参数添加到您的表达,例如让它(p*5)+(9/4)在那里p是一个int参数:
ParameterExpression p = Expression.Parameter(typeof(int));
BinaryExpression b1 = Expression.MakeBinary(ExpressionType.Multiply, p, Expression.Constant(5));//(p*5)
BinaryExpression b2 = Expression.MakeBinary(ExpressionType.Divide, Expression.Constant(9), Expression.Constant(4));//(9/4)
BinaryExpression b4 = Expression.MakeBinary(ExpressionType.Add, b1, b2);
var compiledLambda = (Func<int,int>)Expression.Lambda<Func<int,int>>(b4, new[] {p}).Compile();
Console.WriteLine(compiledLambda(10)); // Prints 52
Console.WriteLine(compiledLambda(8)); // Prints 42
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |