一个动态构建 LambdaExpression Tree 的示例
直接贴代码了:
public class ExpressionTreeBuildingSampleTwo : Sample
{
public override string Name { get; } = "Building Expression Trees, Sample 2: Building Loops and Conditionals"; public override void Run()
{
// This code builds the equivalent of:
Func<int, int> factorialFunc = (n) =>
{
var res = ;
while (n > )
{
res = res * n;
n--;
}
return res;
}; var nArgument = Expression.Parameter(typeof(int), "n");
//Expression.Parameter (可能是声明参数的操作) : int n;
// A=Expression.Parameter 和 B=Expression.Variable 区别可能是:A是委托的传入参数,B是方法体内的局部变量。
var result = Expression.Variable(typeof(int), "result"); // int result; // Creating a label that represents the return value
LabelTarget label = Expression.Label(typeof(int)); //Expression.Label (可能是声明返回值操作) : return result var initializeResult = Expression.Assign(result, Expression.Constant());//Expression.Assign (赋值操作) : {(result = 1)} // This is the inner block that performs the multiplication,
// and decrements the value of 'n'
var block = Expression.Block(
Expression.Assign(result, // Expression.Assign (赋值操作) : result = result * n
Expression.Multiply(result, nArgument)), //Expression.Multiply (变量乘[*]操作) : result * n
Expression.PostDecrementAssign(nArgument) // /Expression.PostDecrementAssign (变量减减[--]操作) : {(n--)}
); //最终呈现如下:
/* {
result = result * n;
n--;
} */ BinaryExpression nGreaterThanOneExpression = Expression.GreaterThan(nArgument, Expression.Constant());
// Expression.GreaterThan (大于操作) : n > 1 //public static ConditionalExpression IfThenElse(Expression test, Expression ifTrue, Expression ifFalse)
var loopBodyExpression = Expression.IfThenElse(
nGreaterThanOneExpression, // n > 1
block, // { result = result * n; n--; }
Expression.Break(label, result)
);
//上面大概最终呈现:
/*
if(n > 1)
{
{
result = result * n;
n--;
}
}
else
{
break
} */ LoopExpression loopExpression = Expression.Loop(loopBodyExpression, label);
// Expression.Loop (循环操作) : // Creating a method body.
// public static BlockExpression Block(IEnumerable<ParameterExpression> variables, params Expression[] expressions)
BlockExpression body = Expression.Block(
new[] { result }, /* IEnumerable<ParameterExpression> variables */
initializeResult, /* Expression 1 ( { int result = 1} ) */
loopExpression
/* Expression 2 */
/* while (n > 1)
{
res = res * n;
n--;
}
return res; */
); var factorial = Expression.Lambda(body, nArgument); // Compile and run an expression tree.
var func = (Func<int, int>)factorial.Compile(); Console.WriteLine(func());
var visitor = Visitor.CreateFromExpression(factorial);
visitor.Visit("");
}
}
谢谢浏览!
一个动态构建 LambdaExpression Tree 的示例的更多相关文章
- 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(3)
4.3 构建一个灵活的用户界面 当设计你的应用程序要支持大范围的屏幕尺寸时,你可以在不同的布局配置中重用碎片,来根据可用的屏幕空间优化用户体验. 例如,在手持设备上,它可能是适应来在一个单窗格用户界面 ...
- C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式
可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...
- Mybatis之动态构建SQL语句
今天一个新同事问我,我知道如何利用XML的方式来构建动态SQL,可是Mybatis是否能够利用注解完成动态SQL的构建呢?!!答案是肯定的,MyBatis 提供了注解,@InsertProvider, ...
- C# Lambda 表达式学习之(三):动态构建类似于 c => c.Age == null || c.Age > 18 的表达式
可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...
- [C#.NET 拾遗补漏]13:动态构建LINQ查询表达式
最近工作中遇到一个这样的需求:在某个列表查询功能中,可以选择某个数字列(如商品单价.当天销售额.当月销售额等),再选择 小于或等于 和 大于或等于 ,再填写一个待比较的数值,对数据进行查询过滤. 如果 ...
- C# 动态构建表达式树(二)——构建 Select 和 GroupBy 的表达式
C# 动态构建表达式树(二)--构建 Select 和 GroupBy 的表达式 前言 在上篇中写了表达式的基本使用,为 Where 方法动态构建了表达式.在这篇中会写如何为 Select 和 Gro ...
- 基础才是重中之重~Emit动态构建方法(参数和返回值)
回到目录 对于Emit我们知道它的可以动态构建程序集,类型,方法,属性等,或者说只要手动使用C#创建的东西使用Emit也都可以动态创建它们,Emit由于它的特别之处,所以在很多领域得到了广泛的应用,像 ...
- grunt配置太复杂?发布一个前端构建工具,简单高效,自动跳过未更新的文件
做前端项目,如果没有一个自动化构建工具,手动处理那简直就是坑爹O(∩_∩)O.于是上网了解了下,grunt用的人不少,功能也挺强大.看了一下grunt的配置(包括gulp),感觉稍显复杂.当时项目结构 ...
- LINQ to SQL 运行时动态构建查询条件
在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...
随机推荐
- 【BZOJ4823】[CQOI2017]老C的方块(网络流)
[BZOJ4823][CQOI2017]老C的方块(网络流) 题面 BZOJ 题解 首先还是给棋盘进行黑白染色,然后对于特殊边左右两侧的格子单独拎出来考虑. 为了和其他格子区分,我们把两侧的这两个格子 ...
- solidity智能合约如何判断mapping值为空
mapping值的判断问题 在Java这类编程语言中,我们可以获得Map里面的值然后与null或空来进行判断该key对应的值是否为空.可是在solidity中貌似并没有提供类似的判断.那么我们如果来进 ...
- OpenGL入门1.7:摄像机
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 我们已经知道了何为观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点) OpenGL本身没有摄像机(Camera)的概 ...
- abp实战-ContosoUniversity Abp版-1运行项目
1. 去abp官网下载模板工程,当前最新版本是abp5.0,基于.net core 3.0 https://aspnetboilerplate.com/ 项目名称为ContosoAbp 这里使用的是n ...
- LinuxShell——管道命令
LinuxShell——管道命令 摘要:本文主要学习了Shell中的管道命令. grep命令 grep命令的作用是在文件中提取和匹配符合条件的字符串行,全称是Global Regular Expres ...
- 工具类ToastUtil 避免在子线程中使用抛异常 "Can't create handler inside thread that has not called Looper.prepare()"
package com.example.kbr.utils; import android.view.Gravity; import android.widget.Toast; import io.r ...
- HttpClient的使用今天遇到一个巨坑——HttpEntity内容取不出来
在使用HttpPost httpPost = new HttpPost(postUrl);的post请求后,拿到返回的response,response返回200成功. 到此没有任何问题. respo ...
- Saltstack_使用指南11_配置管理-状态之间依赖关系
1. 说明 下文的案例是根据上一篇文章进行的修改.因此请优先读取上一篇文章内容<Saltstack_10_配置管理-状态模块> 并且目录进行了变化,从 /srv/salt/lamp 变为了 ...
- [日常] 解决github速度特别慢
执行下面这俩命令,找到对应的IP,增加host就能解决 nslookup github.global.ssl.fastly.Netnslookup github.com root@tao-PC:/va ...
- 12. final修饰符
一.final修饰符概述 1. final可以修饰类.变量和方法 2. final修饰的类.变量和方法不可改变 3. 不允许为final变量重新赋值,子类不允许覆盖父类的final方法,final类不 ...