表达式:使用API创建表达式树(2)
一、BlockExpression类:表式一个包含可在其中定义变量的表达式序列的块。是一组表达式,类似于多个委托的 += 后的效果,其返回表达式是最后一个表达式决定。
以下是BlockExpression的例子(取自官网中的例子,略改了下)
- //声明一个包含有4个表达式的表达式块。
- BlockExpression blockExpr = Expression.Block(Expression.Call(null,
- typeof(Console).GetMethod("Write", new Type[] { typeof(String) }), Expression.Constant("你好!")),//
- Expression.Call(null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
- Expression.Constant("BlockExpression表达式!")), //
- Expression.Constant(), //
- Expression.Call(null, typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }),
- Expression.Constant("测试1 "), Expression.Constant("测试2")) //
- );
- Console.WriteLine("***********************");
- Console.WriteLine("显示表达示块的执行结果:");
- // 首先创建表达式树,
- // 编译,执行.
- var result = Expression.Lambda<Func<string>>(blockExpr).Compile()();
- // 显示表达式块各表达式.
- Console.WriteLine("表达式块中的各表达式:");
- foreach (var expr in blockExpr.Expressions)
- Console.WriteLine(expr.ToString());
- // 表达式返回值
- Console.WriteLine("表达式返回值");
- Console.WriteLine(result);
- //***********************
- // 显示表达示块的执行结果:
- //你好!BlockExpression表达式!
- //表达式块中的各表达式:
- //Write("你好!")
- //WriteLine("BlockExpression表达式!")
- //42
- //Concat("测试1 ", "测试2")
- //表达式返回值
- //测试1 测试2
二、CatchBlock类:表示 try 块中的 catch 语句。
单独的CatchBlock是没有意义的,他必需和TryExpression一起使用才有用。
TryExpression类:表示 try/catch/finally/fault 块。
构建如下表达式:(try {} Catch {})
- TryExpression tryCatchExpr = Expression.TryCatch(
- Expression.Block(
- Expression.Divide(Expression.Constant(), Expression.Constant()),
- Expression.Constant("无异常返回")
- ),
- Expression.Catch(
- typeof(DivideByZeroException),
- Expression.Constant("异常返回")
- )
- );
- Console.WriteLine(Expression.Lambda<Func<string>>(tryCatchExpr).Compile()());
- //输出为 :无异常返回
将上面的 Expression.Constant(2),更改为 Expression.Constant(0)
- //输出为:异常返回
如果无法判断异常类型,刚将typeof(DivideByZeroException),换成 typeof(Exception);
如要增加 Finally,则用 TryCatchFinally 构建:
- TryExpression tryCatchExpr2 = Expression.TryCatchFinally(
- Expression.Block(
- Expression.Divide(Expression.Constant(), Expression.Constant()),
- Expression.Constant("无导常返回")
- ),
- Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),
- Expression.Constant("Finally 块")),
- Expression.Catch(typeof(Exception),
- Expression.Constant("导常返回")
- )
- );
- Console.WriteLine(Expression.Lambda<Func<string>>(tryCatchExpr2).Compile()());
表达式:使用API创建表达式树(2)的更多相关文章
- 表达式:使用API创建表达式树(3)
一.DebugInfoExpression:发出或清除调试信息的序列点. 这允许调试器在调试时突出显示正确的源代码. static void Main(string[] args) { var asm ...
- 表达式:使用API创建表达式树(1)
表达式树可使用Expressions类的静态工厂方法来创建.这种用API的方式创建给予我们在编程极大的灵活性,MSDN上关于表达式的例子也不少,但在使用过程中还是会遇到许多麻烦,对有的表达式类,介绍得 ...
- 表达式:使用API创建表达式树(6)
一.ConstantExpression:表示具有常量值的表达式.因为表达式应用过程中,参数据多是 Expressions 类型,算是对常量值的一种包装吧. ConstantExpression使用比 ...
- 表达式:使用API创建表达式树(5)
一.ConditionalExpression:表达式 生成如 IIF((a == b), "a和b相等", "a与b不相等") 式子. 使用: Paramet ...
- 表达式:使用API创建表达式树(4)DynamicExpression
DynamicExpression:表示动态操作.这个网上可见的资料少得可怜,但想到MVC和第三方的动态语言能在NET运行.好奇的倒腾了下 先声明两个类(有相同的方法和字段,但不是继承于同一接口的类) ...
- EF4.0、4.3创建表达式树状动态查询总结
---------------------------------------------快速适用 效果: where name like '%王%' and Age>=35 or Age< ...
- 【C#表达式树 五】工厂模式创建表达式树节点
常量 1.值常量 (p)=>100+88+p ParameterExpression par = Expression.Parameter(typeof(int), "p" ...
- [C# Expression] 之动态创建表达式
上一篇中说到了 Expression 的一些概念性东西,其实也是为了这一篇做知识准备.为了实现 EFCore 的多条件.连表查询,简化查询代码编写,也就有了这篇文章. 在一些管理后台中,对数据进行 ...
- NX二次开发-NX11创建表达式组NXOpen::ExpressionGroup
NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_part.h> #include < ...
随机推荐
- gridview数据导出到word和excel以及excel的导入
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...
- WMDestroy函数调用inherited,难道是为了调用子类覆盖函数?还有这样调用的?
又碰到了: procedure TWinControl.WMDestroy(var Message: TWMDestroy); begin inherited; // important7 fixme ...
- 又拍云——图像处理师(GraphicsMagick、ImageMagick、FFmpeg)
云处理平台开发工程师 工作地:杭州 岗位职责:负责云处理平台研发工作: 岗位要求: 扎实的 C 语言编程基础及算法优化能力: 至少能够熟练使用一门脚本语言(Python.Ruby.Lua 等)进行日常 ...
- javascript中神奇的(+)加操作符
javascript是一门神奇的语言,这没神奇的语言中有一个神奇的加操作符. 常用的加操作符我们可以用来做: 加法运算,例如:alert(1+2); ==>3 字符串连接,例如:alert(“a ...
- wcf纯代码创建控制台应用
https://svn.apache.org/repos/asf/incubator/stonehenge/contrib/stocktrader/dotnet/ stocktrader项目的dotn ...
- 直接拿来用!最火的android开源项目(一)
不好意思尊重一下作者咯.详情见:csdn:http://www.csdn.net/article/2013-05-03/2815127-Android-open-source-projects
- Ajax的简单小例子
1.首先下载ajax.dll,一个百度一下都有下载的!自行查找. 2.把ajax.dll导入到工程.右键工程-->添加引用--->浏览,找到下载好的ajax.dll文件,点击确定,这时候在 ...
- 新型Web劫持技术
该类新型Web劫持是利用script脚本实现的.在已知的案例中,黑客入侵了某地方门户网站,篡改了该网站的新闻页面,并向这些页面植入自己的广告.新闻及恶意代码.一旦用户从搜索结果页面点击进入被篡改过的新 ...
- Hibernate(三)Hibernate 配置文件
在上次的博文Hibernate(二)Hibernate实例我们已经通过一个实例的演示对Hibernate 的基本使用有了一个简单的认识,这里我们在此简单回顾一下Hibernate框架的使用步骤. Hi ...
- 分布式系统里session同步的那些事儿
几周前,有个盆友问老王,说现在有多台服务器,怎么样来解决这些服务器间的session同步问题?老王一下就来精神了,因为在n年以前,老王还在学校和几个同学一起所谓创业的时候,也遇到了类似的问题.当时查了 ...