一个动态构建 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 ...
随机推荐
- mysql压缩备份导入导出
mysqldump工具自带选项没有对导出备份文件压缩功能,可结合gzip只使用一条命令压缩导出文件,方法如下: mysqldump压缩导出:# mysqldump -h192.168.0.3 -P33 ...
- 遍历json数据的几种方式
json(JavaScript Object Notation),json是一种多用于存储和交换文本信息的语法.他能够进行数据的传输,通常和ajax一起使用.它具有体积小.速度快,易解析等诸多优点. ...
- Android方法数超出限定的问题(multiDex,jumboMode)
在Android项目开发中,项目代码量过大或通过引入很多jar导致代码量急剧增加,会出现错误: android.dex.DexIndexOverflowException: Cannot merge ...
- NOI2019退役记 upd:2019.12.1
(我把原来写的东西全部删掉了) AFO. 我退役了,\(\mbox{yyb}\)退役了. 至少,在接下来的日子里,我得投身到文化课,度过快乐的高三生活了. 这两年的\(OI\)生涯给了我很多,让我学会 ...
- MapReduce Shuffle 和 Spark Shuffle 原理概述
Shuffle简介 Shuffle的本意是洗牌.混洗的意思,把一组有规则的数据尽量打乱成无规则的数据.而在MapReduce中,Shuffle更像是洗牌的逆过程,指的是将map端的无规则输出按指定的规 ...
- Razor 进度的变速
视频录制了 .但发现 进度太慢了,对于当下市场 和我们的学习进度基本不会成正比关系了.所以,改一下 我们教程的实现方式. 我和大家 一起 看一下关联的技术的点, 提出我们要做的 内容 动手实践, 可能 ...
- Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
TimeUnit是一个时间单位枚举类,主要用于并发编程,时间单元表示给定粒度单元的时间持续时间,并提供实用程序方法来跨单元转换,以及在这些单元中执行计时和延迟操作. 1.时间单位换算 (1)支持的单位 ...
- Java的包
Java 包 Java面向对象的核心的概念:类.接口.抽象类.对象:[主体] 包的定义: 指的是一个程序的目录,在最早的时候,如果要开发一个程序,只需要定义一个Java文件,而后在这个文件中编写所需要 ...
- [转] Hystrix 使用与分析
原文地址:http://hot66hot.iteye.com/blog/2155036 转载请注明出处哈:http://hot66hot.iteye.com/blog/2155036 一:为什么需要H ...
- markdown的语法
目录 md格式是一个纯文本格式,对于一个程序员来说,用md格式代替word.txt等格式用来写说明文档或者blog,目前github以及CSDN都支持md格式书写blog了. md格式的语法: 无序列 ...