一、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. 保留你的dSYM文件

    大家编译iPhone程序的时候,都会发现二进制文件的旁边生成了一个.dSYM文件.以前一直不知道这个文件是用来干嘛的,今天才知道这个是symbol file,用来debug用的. 大家可以读读这篇文档 ...

  2. XP系统VPN设置

    为了解除公司上网策略限制,或者为了上Google,Facebook,都可以通过设置VPN实现. 要使用VPN需要到VPN服务商注册,链接VPN服务商. ======================== ...

  3. 改善 ASP.NET MVC 代码库的 5 点建议

    MVC,建议 刚刚检查完支持工单中的一些代码,笔者想针对 ASP.NET MVC 应用的改进写一些建议.这些内容仍在笔者脑海中,愿与各位一同分享.若你已使用 MVC 一段时间,那么以下内容可能并不新鲜 ...

  4. log4j学习日记-写入数据库

    1.首先创建日志数据库 用的是MySQL CREATE TABLE `td_log` (   `lid` int(11) NOT NULL AUTO_INCREMENT,   `lusername` ...

  5. Activity 怎样获得另一个xml布局文件的控件

    两个布局文件,一个main.xml,一个main2.xml,一个MActivity,在MActivity的onCreate()里设置的是setContentView(R.layout.main).现在 ...

  6. wcf客户端捕获异常

    直接使用Exception进行捕获,然后在监视器中查看具体是哪一个异常 System.Exception {System.ServiceModel.Security.MessageSecurityEx ...

  7. bzoj1560

    首先这种题目肯定是要先排序,以x为第一关键字,y为第二关键字不难想到O(n2)的dp,下面显然要优化不难发现,由于两点的耗费是坐标差的平方的和,不带根号,因此,不难发现一个很有用的性质,如果从A点能到 ...

  8. Mysql慢日志查询

    MYSQL慢查询配置: 查看是否启用慢日志查询: show VARIABLES like '%quer%'; 没有配置的情况下慢查询是关闭的:

  9. touchend事件的preventDefault阻止掉了click事件

    <div id="box">box</div> <script> var isTouchDevice = function() { return ...

  10. 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)

    卷 backup 的文件夹 PATH 列表卷序列号为 00000025 D4A8:14B0J:.│  1.txt│  c语言经典案例效果图示.doc│  ├─1传智播客_尹成_C语言从菜鸟到高手_第一 ...