一个动态构建 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多表关联update
日常的开发中一般都是写的单表update语句,很少写多表关联的update. 不同于SQL Server,在MySQL中,update的多表连接更新和select的多表连接查询在使用的方法上存在一些小 ...
- C# redis StackExchange
1.Install-Package StackExchange -v 2.0.601 2.using StackExchange.Redis; 3. static void StackExchange ...
- sql server 随记 -- 月份/日期 查询
月份 SELECT * FROM ( ] ) a UNPIVOT ( xxx ]) ) a2; 日期 SELECT * FROM ( ] )a UNPIVOT( xxx ]) )a2 (存档)
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- python中time、datetime模块的使用
目录 python中time.datetime模块的使用 1.前言 2.time模块 1.时间格式转换图 2.常用方法 3.datetime模块 python中time.datetime模块的使用 1 ...
- Element-ui中ElScrollBar组件滚动条的使用
在翻看 element-ui官网的文档时,发现其左侧导航和右边的内容超出屏幕时,滚动条的样式比较小巧,通过浏览器审查工具查看,发现它是使用了el-scrollbar的样式,跟element-ui的组件 ...
- 02Javascript变量和数据类型
1. 变量概述 1.1 什么是变量 通俗:变量是用于存放数据的容器. 我们通过 变量名 获取数据,甚至数据可以修改. 1.2 变量在内存中的存储 本质:变量是程序在内存中申请的一块用来存放数据的空间. ...
- CSS @规则
最近在看极客时间winter大神的重学前端系列,遇到了许多不常用但是很重要的知识点.感觉视野得到了极大的开阔(打个广告,哈哈). 其中css @规则令人印象深刻.简单的做下笔记: @namespace ...
- haproxy动静分离的验证
线上出现过项目的静态文件被拦截,不能直接访问.所以想到了haproxy指向对应的url来访问静态文件,想到这里在网络搜索了下,确实有此功能.立即上测试环境验证下: 在listen中增加两行: #定 ...
- Event事件、进程池与线程池、协程
目录 Event事件 进程池与线程池 多线程爬取梨视频 协程 协程目的 gevent TCP服务端socket套接字实现协程 Event事件 用来控制线程的执行 出现e.wait(),就会把这个线程设 ...