一、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)的更多相关文章

  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. 当我们在谈论 DevOps,我们在谈论什么?

    Cloud Insight 携手 BearyChat:打造适合运维人员的团队协作工具 走过 C 轮的 OneAPM,旗下的产品已经日渐丰满,从应用性能监控的 Application Insight 到 ...

  2. Palindrome

    poj3974:http://poj.org/problem?id=3974 题意:求给定长度最长回文串的长度. 题解:直接套manacher,搞定. #include<iostream> ...

  3. 深入了解一下PYTHON中关于SOCKETSERVER的模块-A

    有了这块知识,应该对各类WEB框架有更好的理解吧..FLASK,DJANGO,WEBPY.... #!/usr/bin/env python from BaseHTTPServer import HT ...

  4. 【POJ1284】Primitive Roots 欧拉函数

    题目描述: 题意: 定义原根:对于一个整数x,0<x<p,是一个mod p下的原根,当且仅当集合{ (xi mod p) | 1 <= i <= p-1 } 等于{ 1, .. ...

  5. SysErrorMessage 函数和系统错误信息表

    在看 API 文档时, 我们经常见到 GetLastError; 它可以返回操作后系统给的提示.但 GetLastError 返回的只是一个信息代码, 如何返回对应的具体信息呢?FormatMessa ...

  6. 【HDOJ】4109 Instrction Arrangement

    差分约束. /* 4109 */ #include <iostream> #include <queue> #include <vector> #include & ...

  7. Node.js权威指南 (9) - 进程与子进程

    9.1 Node.js中的进程 / 225 9.1.1 进程对象的属性 / 225 9.1.2 进程对象的方法与事件 / 2279.2 创建多进程应用程序 / 235 9.2.1 使用spawn方法开 ...

  8. 【VirtualDOM】

    前沿技术解密——VirtualDOM miniflycn/qvd Matt-Esch/virtual-dom Facebook React 和 Web Components(Polymer)对比优势和 ...

  9. 通过ComponentName获取相应的Widget

    最近在锁屏上研究,如果预置widget,研究了好久,终于找到方法了,先上代码: private int getAppWidgetFromComName(ComponentName providerCo ...

  10. Android 布局之DrawLayout

    在刚开始学android的时候肯定会知道,android的主要的布局就是LinearLayout.RelativeLayout.FramLayout.AbsoluteLayout.以及TableLay ...