一、BlockExpression类:表式一个包含可在其中定义变量的表达式序列的块。是一组表达式,类似于多个委托的 += 后的效果,其返回表达式是最后一个表达式决定。
以下是BlockExpression的例子(取自官网中的例子,略改了下)

  1. //声明一个包含有4个表达式的表达式块。
  2. BlockExpression blockExpr = Expression.Block(Expression.Call(null,
  3. typeof(Console).GetMethod("Write", new Type[] { typeof(String) }), Expression.Constant("你好!")),//
  4. Expression.Call(null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
  5. Expression.Constant("BlockExpression表达式!")), //
  6. Expression.Constant(), //
  7. Expression.Call(null, typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }),
  8. Expression.Constant("测试1 "), Expression.Constant("测试2")) //
  9. );
  10. Console.WriteLine("***********************");
  11. Console.WriteLine("显示表达示块的执行结果:");
  12.  
  13. // 首先创建表达式树,
  14. // 编译,执行.
  15. var result = Expression.Lambda<Func<string>>(blockExpr).Compile()();
  16.  
  17. // 显示表达式块各表达式.
  18. Console.WriteLine("表达式块中的各表达式:");
  19. foreach (var expr in blockExpr.Expressions)
  20. Console.WriteLine(expr.ToString());
  21.  
  22. // 表达式返回值
  23. Console.WriteLine("表达式返回值");
  24. Console.WriteLine(result);
  25.  
  26. //***********************
  27. // 显示表达示块的执行结果:
  28. //你好!BlockExpression表达式!
  29. //表达式块中的各表达式:
  30. //Write("你好!")
  31. //WriteLine("BlockExpression表达式!")
  32. //42
  33. //Concat("测试1 ", "测试2")
  34. //表达式返回值
  35. //测试1 测试2

二、CatchBlock类:表示 try 块中的 catch 语句。
  单独的CatchBlock是没有意义的,他必需和TryExpression一起使用才有用。
  TryExpression类:表示 try/catch/finally/fault 块。
  构建如下表达式:(try {} Catch {})

  

  1. TryExpression tryCatchExpr = Expression.TryCatch(
  2. Expression.Block(
  3. Expression.Divide(Expression.Constant(), Expression.Constant()),
  4. Expression.Constant("无异常返回")
  5. ),
  6. Expression.Catch(
  7. typeof(DivideByZeroException),
  8. Expression.Constant("异常返回")
  9. )
  10. );
  11. Console.WriteLine(Expression.Lambda<Func<string>>(tryCatchExpr).Compile()());
  12.  
  13. //输出为 :无异常返回

  将上面的  Expression.Constant(2),更改为   Expression.Constant(0)

  1. //输出为:异常返回

如果无法判断异常类型,刚将typeof(DivideByZeroException),换成  typeof(Exception);

如要增加 Finally,则用 TryCatchFinally 构建:

  1. TryExpression tryCatchExpr2 = Expression.TryCatchFinally(
  2. Expression.Block(
  3. Expression.Divide(Expression.Constant(), Expression.Constant()),
  4. Expression.Constant("无导常返回")
  5. ),
  6. Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),
  7.     Expression.Constant("Finally 块")),
  8. Expression.Catch(typeof(Exception),
  9.  
  10. Expression.Constant("导常返回")
  11. )
  12. );
  13. Console.WriteLine(Expression.Lambda<Func<string>>(tryCatchExpr2).Compile()());

表达式:使用API创建表达式树(2)的更多相关文章

  1. 表达式:使用API创建表达式树(3)

    一.DebugInfoExpression:发出或清除调试信息的序列点. 这允许调试器在调试时突出显示正确的源代码. static void Main(string[] args) { var asm ...

  2. 表达式:使用API创建表达式树(1)

    表达式树可使用Expressions类的静态工厂方法来创建.这种用API的方式创建给予我们在编程极大的灵活性,MSDN上关于表达式的例子也不少,但在使用过程中还是会遇到许多麻烦,对有的表达式类,介绍得 ...

  3. 表达式:使用API创建表达式树(6)

    一.ConstantExpression:表示具有常量值的表达式.因为表达式应用过程中,参数据多是 Expressions 类型,算是对常量值的一种包装吧. ConstantExpression使用比 ...

  4. 表达式:使用API创建表达式树(5)

    一.ConditionalExpression:表达式 生成如 IIF((a == b), "a和b相等", "a与b不相等") 式子. 使用: Paramet ...

  5. 表达式:使用API创建表达式树(4)DynamicExpression

    DynamicExpression:表示动态操作.这个网上可见的资料少得可怜,但想到MVC和第三方的动态语言能在NET运行.好奇的倒腾了下 先声明两个类(有相同的方法和字段,但不是继承于同一接口的类) ...

  6. EF4.0、4.3创建表达式树状动态查询总结

    ---------------------------------------------快速适用 效果: where name like '%王%' and Age>=35 or Age< ...

  7. 【C#表达式树 五】工厂模式创建表达式树节点

    常量 1.值常量  (p)=>100+88+p ParameterExpression par = Expression.Parameter(typeof(int), "p" ...

  8. [C# Expression] 之动态创建表达式

    上一篇中说到了 Expression 的一些概念性东西,其实也是为了这一篇做知识准备.为了实现 EFCore 的多条件.连表查询,简化查询代码编写,也就有了这篇文章.   在一些管理后台中,对数据进行 ...

  9. NX二次开发-NX11创建表达式组NXOpen::ExpressionGroup

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_part.h> #include < ...

随机推荐

  1. gridview数据导出到word和excel以及excel的导入

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  2. WMDestroy函数调用inherited,难道是为了调用子类覆盖函数?还有这样调用的?

    又碰到了: procedure TWinControl.WMDestroy(var Message: TWMDestroy); begin inherited; // important7 fixme ...

  3. 又拍云——图像处理师(GraphicsMagick、ImageMagick、FFmpeg)

    云处理平台开发工程师 工作地:杭州 岗位职责:负责云处理平台研发工作: 岗位要求: 扎实的 C 语言编程基础及算法优化能力: 至少能够熟练使用一门脚本语言(Python.Ruby.Lua 等)进行日常 ...

  4. javascript中神奇的(+)加操作符

    javascript是一门神奇的语言,这没神奇的语言中有一个神奇的加操作符. 常用的加操作符我们可以用来做: 加法运算,例如:alert(1+2); ==>3 字符串连接,例如:alert(“a ...

  5. wcf纯代码创建控制台应用

    https://svn.apache.org/repos/asf/incubator/stonehenge/contrib/stocktrader/dotnet/ stocktrader项目的dotn ...

  6. 直接拿来用!最火的android开源项目(一)

    不好意思尊重一下作者咯.详情见:csdn:http://www.csdn.net/article/2013-05-03/2815127-Android-open-source-projects

  7. Ajax的简单小例子

    1.首先下载ajax.dll,一个百度一下都有下载的!自行查找. 2.把ajax.dll导入到工程.右键工程-->添加引用--->浏览,找到下载好的ajax.dll文件,点击确定,这时候在 ...

  8. 新型Web劫持技术

    该类新型Web劫持是利用script脚本实现的.在已知的案例中,黑客入侵了某地方门户网站,篡改了该网站的新闻页面,并向这些页面植入自己的广告.新闻及恶意代码.一旦用户从搜索结果页面点击进入被篡改过的新 ...

  9. Hibernate(三)Hibernate 配置文件

    在上次的博文Hibernate(二)Hibernate实例我们已经通过一个实例的演示对Hibernate 的基本使用有了一个简单的认识,这里我们在此简单回顾一下Hibernate框架的使用步骤. Hi ...

  10. 分布式系统里session同步的那些事儿

    几周前,有个盆友问老王,说现在有多台服务器,怎么样来解决这些服务器间的session同步问题?老王一下就来精神了,因为在n年以前,老王还在学校和几个同学一起所谓创业的时候,也遇到了类似的问题.当时查了 ...