直接贴代码了:

    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 的示例的更多相关文章

  1. 跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(3)

    4.3 构建一个灵活的用户界面 当设计你的应用程序要支持大范围的屏幕尺寸时,你可以在不同的布局配置中重用碎片,来根据可用的屏幕空间优化用户体验. 例如,在手持设备上,它可能是适应来在一个单窗格用户界面 ...

  2. C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

  3. Mybatis之动态构建SQL语句

    今天一个新同事问我,我知道如何利用XML的方式来构建动态SQL,可是Mybatis是否能够利用注解完成动态SQL的构建呢?!!答案是肯定的,MyBatis 提供了注解,@InsertProvider, ...

  4. C# Lambda 表达式学习之(三):动态构建类似于 c => c.Age == null || c.Age > 18 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

  5. [C#.NET 拾遗补漏]13:动态构建LINQ查询表达式

    最近工作中遇到一个这样的需求:在某个列表查询功能中,可以选择某个数字列(如商品单价.当天销售额.当月销售额等),再选择 小于或等于 和 大于或等于 ,再填写一个待比较的数值,对数据进行查询过滤. 如果 ...

  6. C# 动态构建表达式树(二)——构建 Select 和 GroupBy 的表达式

    C# 动态构建表达式树(二)--构建 Select 和 GroupBy 的表达式 前言 在上篇中写了表达式的基本使用,为 Where 方法动态构建了表达式.在这篇中会写如何为 Select 和 Gro ...

  7. 基础才是重中之重~Emit动态构建方法(参数和返回值)

    回到目录 对于Emit我们知道它的可以动态构建程序集,类型,方法,属性等,或者说只要手动使用C#创建的东西使用Emit也都可以动态创建它们,Emit由于它的特别之处,所以在很多领域得到了广泛的应用,像 ...

  8. grunt配置太复杂?发布一个前端构建工具,简单高效,自动跳过未更新的文件

    做前端项目,如果没有一个自动化构建工具,手动处理那简直就是坑爹O(∩_∩)O.于是上网了解了下,grunt用的人不少,功能也挺强大.看了一下grunt的配置(包括gulp),感觉稍显复杂.当时项目结构 ...

  9. LINQ to SQL 运行时动态构建查询条件

    在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...

随机推荐

  1. 黄聪:PHP转换网址相对路径到绝对路径的一种方法

    相信很多程序(尤其是采集类的程序)都会有需要把网址的相对路径转换成绝对路径的需要,例如采集到某页面的HTML代码中包含资源文件经常会看到这样的文件名: <link rel="style ...

  2. 【洛谷5008】逛庭院(Tarjan,贪心)

    [洛谷5008]逛庭院(Tarjan,贪心) 题面 洛谷 题解 如果图是一个\(DAG\),我们可以任意选择若干个不是入度为\(0\)的点,然后把它们按照拓扑序倒序删掉,不难证明这样一定是合法的. 现 ...

  3. 浏览器关闭后Session真的消失了吗?

    今天想和大家分享一个关于Session的话题: 当浏览器关闭时,Session就被销毁了?  我们知道Session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保 存当前用户的状态信 ...

  4. C#简单的枚举及结构

    using System; namespace program { enum WeekDays { a, b, c = ,//11 赋值以后就变成11,不赋值就是2 d, e, f, g }//不能输 ...

  5. Java的23种设计模式,详细讲解(三)

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  6. php实现基础排序算法

    <?php header("content-type:text/html;charset=utf-8"); $testArr = array(); $time1 = micr ...

  7. 解决sublime快捷键回车换行问题

    鼠标右键sublime 以管理员身份运行 打开首选项里面的按键绑定用户 将下面的代码粘贴复制 { "keys": ["enter"], "comman ...

  8. Google在情报搜集中的基础技巧

    Google在情报搜集中的基础技巧 作者:王宇阳 时间:2019-06-06 作者笔记 ​ Google Hacking 是指使用特定的高级的google搜索语法,收集渗透测试目标的信息,查找目标的配 ...

  9. 「SAP 技术」SAP MM 给合同的ITEM上传附件以及附件查询

    SAP MM 给合同的ITEM上传附件以及附件查询 1,使用事务代码 CV01N为合同上传附件, Document:输入6100000829, Document type 101 (contract) ...

  10. Fiddler使用技巧:强大的数据文本编解码功能

    - 总览 打开Fiddler后,使用快捷键Ctrl+e或者点击菜单Tools-->TextWizard...即可进入TextWizard界面. 界面上方为输入框,用来输入需要编码或解码的数据. ...