也作一下装配脑袋的Expression习题【转】
http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html
二.参考
http://msdn.microsoft.com/zh-cn/library/system.linq.expressions.expression.aspx
http://msdn.microsoft.com/zh-cn/library/bb361179%28v=VS.100%29.aspx
三.思路
先写出lambda,参照lambda拼出Expression
四.做题
(1).-a
Expression<Func<int, int>> lambdaexpression = a => -a; ParameterExpression p1 = Expression.Parameter(typeof(int), "a");
Expression body = Expression.Negate(p1);
LambdaExpression expression = Expression.Lambda(body, p1); Console.WriteLine(lambdaexpression.ToString());
Console.WriteLine(expression.ToString());Expression.Negate方法返回类型是UnaryExpression,一元运算表达式
(2).a + b * 2
Expression<Func<int, int, int>> lambdaexpression = (a, b) => a + b * ; ParameterExpression p1 = Expression.Parameter(typeof(int), "a");
ParameterExpression p2 = Expression.Parameter(typeof(int), "b");
Expression body = Expression.Add(p1, Expression.Multiply(p2, Expression.Constant()));
LambdaExpression expression = Expression.Lambda(body, p1, p2); Console.WriteLine(lambdaexpression.ToString());
Console.WriteLine(expression.ToString());Expression.Add和Expression.Multiply都返回BinaryExpression,二元运算表达式,
Expression.Constant返回ConstantExpression,常量表达式(3).Math.Sin(x) + Math.Cos(y)
Expression<Func<double, double, double>> lambdaexpression = (x, y) => Math.Sin(x) + Math.Cos(y); ParameterExpression p1 = Expression.Parameter(typeof(double), "x");
ParameterExpression p2 = Expression.Parameter(typeof(double), "y");
Expression body = Expression.Add(
Expression.Call(null, typeof(Math).GetMethod("Sin", BindingFlags.Static | BindingFlags.Public), p1)
, Expression.Call(null, typeof(Math).GetMethod("Cos", BindingFlags.Static | BindingFlags.Public), p2));
LambdaExpression expression = Expression.Lambda(body, p1, p2); Console.WriteLine(lambdaexpression.ToString());
Console.WriteLine(expression.ToString());Expression.Call返回MethodCallExpression,方法调用表达式
(4).new StringBuilder(“Hello”)
Expression<Func<StringBuilder>> lambdaexpression = () => new StringBuilder("Hello"); Expression body = Expression.New(typeof(StringBuilder).GetConstructor(new Type[] { typeof(string) }),
Expression.Constant("Hello"));
LambdaExpression expression = Expression.Lambda(body); Console.WriteLine(lambdaexpression.ToString());
Console.WriteLine(expression.ToString());Expression.New返回NewExpression,构造函数调用表达式
(5).new int[] { a, b, a + b}
Expression<Func<int, int, int[]>> lambdaexpression = (a, b) => new int[] { a, b, a + b }; ParameterExpression p1 = Expression.Parameter(typeof(int), "a");
ParameterExpression p2 = Expression.Parameter(typeof(int), "b");
Expression body = Expression.NewArrayInit(typeof(int), p1, p2, Expression.Add(p1, p2));
LambdaExpression expression = Expression.Lambda(body, p1, p2); Console.WriteLine(lambdaexpression.ToString());
Console.WriteLine(expression.ToString());Expression.NewArrayInit返回NewArrayExpression,创建数组表达式
(6).a[i – 1] * i
Expression<Func<int[], int, int>> lambdaexpression = (a, i) => a[i - ] * i; ParameterExpression p1 = Expression.Parameter(typeof(int[]), "a");
ParameterExpression p2 = Expression.Parameter(typeof(int), "i");
Expression body = Expression.Multiply(Expression.ArrayIndex(p1, Expression.Subtract(p2, Expression.Constant())), p2);
LambdaExpression expression = Expression.Lambda(body, p1, p2); Console.WriteLine(lambdaexpression.ToString());
Console.WriteLine(expression.ToString());Expression.ArrayIndex返回也是BinaryExpression,这个有点意外,我以为会是MethodCallExpression呢
(7).a.Length > b | b >= 0
Expression<Func<int[], int, bool>> lambdaexpression = (a, b) => a.Length > b | b >= ; ParameterExpression p1 = Expression.Parameter(typeof(int[]), "a");
ParameterExpression p2 = Expression.Parameter(typeof(int), "b");
Expression body = Expression.Or(Expression.GreaterThan(Expression.ArrayLength(p1), p2),
Expression.GreaterThanOrEqual(p2, Expression.Constant()));
LambdaExpression expression = Expression.Lambda(body, p1, p2); Console.WriteLine(lambdaexpression.ToString());
Console.WriteLine(expression.ToString());Expression.GreaterThan、Expression.Or和Expression.ArrayLength都返回BinaryExpression,二元运算表达式,
Expression.ArrayLength和(6)中一样误解了(8).(高难度)new System.Windows.Point() { X = Math.Sin(a), Y = Math.Cos(a) }
Expression<Func<double, System.Windows.Point>> lambdaexpression = a => new System.Windows.Point() { X = Math.Sin(a), Y = Math.Cos(a) }; ParameterExpression p1 = Expression.Parameter(typeof(double), "a");
Expression body = Expression.MemberInit(Expression.New(typeof(System.Windows.Point))
, new MemberBinding[] {
Expression.Bind(typeof(System.Windows.Point).GetProperty("X"),
Expression.Call(null, typeof(Math).GetMethod("Sin", BindingFlags.Static | BindingFlags.Public), p1)),
Expression.Bind(typeof(System.Windows.Point).GetProperty("Y"),
Expression.Call(null, typeof(Math).GetMethod("Cos", BindingFlags.Static | BindingFlags.Public), p1))
});
LambdaExpression expression = Expression.Lambda(body, p1); Console.WriteLine(lambdaexpression.ToString());
Console.WriteLine(expression.ToString());Expression.MemberInit返回MemberInitExpression,如方法名字一样是成员初始化表达式。
果然像题目所写,难度不低,一开始以为使用Expression.New后面的参数,后来还是看了评论才会写。
五.执行结果
a => -a
a => -a(a, b) => (a + (b * 2))
(a, b) => (a + (b * 2))(x, y) => (Sin(x) + Cos(y))
(x, y) => (Sin(x) + Cos(y))() => new StringBuilder("Hello")
() => new StringBuilder("Hello")(a, b) => new [] {a, b, (a + b)}
(a, b) => new [] {a, b, (a + b)}(a, i) => (a[(i - 1)] * i)
(a, i) => (a[(i - 1)] * i)(a, b) => ((ArrayLength(a) > b) Or (b >= 0))
(a, b) => ((ArrayLength(a) > b) Or (b >= 0))a => new Point() {X = Sin(a), Y = Cos(a)}
a => new Point() {X = Sin(a), Y = Cos(a)}
Press any key to continue . . .作完这些习题,感觉让我这个Expression新手真的进步了不少
转载自:http://www.cnblogs.com/llcto/archive/2011/08/12/2136334.html
谢谢浏览!
也作一下装配脑袋的Expression习题【转】的更多相关文章
- 学习ExpressionTree(做装配脑袋出的练习题)
1 // 第一题:画出下列表达式的表达式树.一开始,您很可能不知道某些操作其实也是表达式(比如取数组的运算符a[2]),不过没有关系,后面的习题将帮你验证这一点. //-a ParameterExpr ...
- 使用Expression Tree构建动态LINQ查询
这篇文章介绍一个有意思的话题,也是经常被人问到的:如何构建动态LINQ查询?所谓动态,主要的意思在于查询的条件可以随机组合,动态添加,而不是固定的写法.这个在很多系统开发过程中是非常有用的. 我这里给 ...
- 开源纯C#工控网关+组态软件(八)表达式编译器
一. 引子 监控画面的主要功能之一就是跟踪下位机变量变化,并将这些变化展现为动画.大部分时候,界面上一个图元组件的某个状态,与单一变量Tag绑定,比如电机的运行态,绑定一个MotorRunning ...
- 关于GC和析构函数的一个趣题
这个有趣的问题感谢装配脑袋友情提供. 请看如下代码: public class Dummy { public static Dummy Instance; ; ~Dummy() { Instance ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
- 性能优化-列表类型转换(ConvertList<TSource, TResult>)
之前,在项目中看到过一段通用列表类型转换的代码,直接的实现便是用反射.大概看了下,它用在领域模型转DTO和SOA接口中契约实体的转换等等.首先,它使用了反射,其次,还是在循环中使用,便有了优化的想法. ...
- T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响!
原文:T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst.语言版本影响! CSDN 的 Blog 太滥了!无时不刻地在坏! 开始抢救性搬家 ...
- 列表类型转换(ConvertList<TSource, TResult>)
性能优化-列表类型转换(ConvertList<TSource, TResult>) 2013-12-16 16:55 by stevey, 426 阅读, 7 评论, 收藏, 编辑 之前 ...
- .NET的前世今生与将来
笔者注 谨以此文纪念我敬重的2016年9月17日去世的 装配脑袋 逝世两周年 让大家久等了,前后花了1年的时间,几经改版,终于完成撰写了一万字长文,回顾和展望.NET这16年来的成功与失败.最终能成文 ...
随机推荐
- 解决:perl: warning: Please check that your locale settings
问题: perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LAN ...
- Spring MVC HTTP406 Not Acceptable
今天在搞前后端分离用springmvc传递json数据的时候,第一步就卡主了,本着完事开头难的做法(哈哈哈), 报了个406?什么鬼? 百度之后发现很多人也同我一样遇到过这个问题,记录下. 找到的处理 ...
- Java生鲜电商平台-电商支付流程架构实战
Java生鲜电商平台-电商支付流程架构实战 说明:我一直秉承的就是接地气的业务架构实战.我的文章都有一个这样的核心. 1. 业务场景 2. 解决问题. 3.代码实现. 4.代码重构. 5.总结与复盘. ...
- Netty与RPC
一.Netty原理 Netty是一个高性能.异步事件驱动的NIO框架,基于Java NIO提供的API实现.它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都 ...
- VUE基础实用技巧
Vue以前听说过,有了解过一点.当时还在热衷于原生JavaScript去写一些方法的封装,不是为啥,就感觉这样很帅,后面多多少少接触了一些JQuery的用法,到现在为止,JavaScript原生封装的 ...
- C++ 赋值运算符'='的重载(浅拷贝、深拷贝)
01 赋值运算符重载的需求 有时候希望赋值运算符两边的类型可以不匹配,比如:把一个 int 类型变量赋值给一个Complex(复数)对象,或把一个 char* 类型的字符串赋值给一个字符串对象,此时就 ...
- springcloud vue 微服务分布式 activiti工作流 前后分离 集成代码生成器 shiro权限
1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...
- log4j笔记----输出格式
数说明例子 %c 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 log4j配置文件参数举例 输出显示媒介 假设当前logger名字空间是&q ...
- pyecharts和echarts的混合使用
ECharts是一个由百度开发的纯 Javascript 的图表库,pyecharts是某三位大佬将ECharts移植到Python项目中的产物,在Python网站中可以更轻松的接入图表,但是个人感觉 ...
- [PHP] 近期接手現有的企邮前端框架业务所遇困难
1.邮箱前端有三大产品线,包括免费邮箱,VIP邮箱,企业邮箱,使用的一套代码,在代码中进行的逻辑判断处理,根据不同的配置进行不同的业务操作.有很多逻辑是各产品线是不同的,需要仔细开发和判断才能不会影响 ...