一、ConditionalExpression:表达式 生成如 IIF((a == b), "a和b相等", "a与b不相等") 式子。

使用:

  1. ParameterExpression aiP1 = Expression.Parameter(typeof(int), "a"); //(1)
  2. ParameterExpression aiP2 = Expression.Parameter(typeof(int), "b");
  3. ParameterExpression aiP3 = Expression.Parameter(typeof(int));
  4. Console.WriteLine(aiP3.ToString());
  5. //输出:Param_0
  6. BinaryExpression aiBnExp = Expression.MakeBinary(ExpressionType.Equal,
  7. aiP1,
  8. aiP2);
  9.  
  10. ConditionalExpression aiCdExp = Expression.Condition(
  11. aiBnExp,
  12. Expression.Constant("a和b相等"),
  13. Expression.Constant("a与b不相等")
  14. ); //(2)
  15.  
  16. Console.WriteLine(aiCdExp.ToString());
  17. //输出:IIF((a == b), "a和b相等", "a与b不相等")
  18.  
  19. LambdaExpression aiLamExp = Expression.Lambda(
  20. Expression.Block //(3)
  21. (
  22. new ParameterExpression[] { aiP1, aiP2 }
  23. , Expression.Assign(aiP1, Expression.Constant())
  24. , Expression.Assign(aiP2, Expression.Constant())
  25. , aiCdExp
  26.  
  27. ));
  28. Console.WriteLine(aiLamExp.Compile().DynamicInvoke());
  29.  
  30. Console.ReadLine();

1、在上面代码段中的(1)出现的 ParameterExpression 是参数表达示,使用比较简单,但很常用,只有两个构造方法,生成出的效果和数据式子中的未知数是一个意思,是一个变量的占位符。

2、ConditionalExpression:构建也是容易的, 如果第一个参数的计算结果为 true,则执行第二个参数;否则执行第三个参数。

3、在这个代码(3)中,使用了BlockExpression表达示,在前面已经对他的使用有介绍,这里演示的是,如何通过BlockExpression来生成ParameterExpression的赋值,并将值传入使用该参数的表达式中。(3)的表达式视图为
        .Lambda #Lambda1<System.Func`1[System.String]>() {
            .Block(
            System.Int32 $a,
            System.Int32 $b) {
            $a = 10;
            $b = 30;
            .If ($a == $b) {
                "a和b相等"
            } .Else {
                "a与b不想等"
            }
            }
        }
    因此,如果有参数赋值时,顺序是:1)、参数声明 ;2)、参数赋值;3)、使用此参数(列表)的表达示;

二、SwitchExpression:表示一个控制表达式,该表达式通过将控制传递到 SwitchCase 来处理多重选择。

  1. //构建类似下列代码的表达式
  2. //int i = 1;
  3. //switch (i)
  4. //{
  5. // case 1:
  6. // Console.WriteLine("一等奖");
  7. // break;
  8. // case 2:
  9. // Console.WriteLine("二等奖");
  10. // break;
  11. // case 3:
  12. // Console.WriteLine("三等奖");
  13. // break;
  14. // default:
  15. // Console.WriteLine("鼓励奖");
  16. // break;
  17. //}
  18.  
  19. //声明 SwitchCase 的称值参数,相当于 switch (i)
  20. ParameterExpression aiSwvP = Expression.Parameter(typeof(int), "i");
  21.  
  22. //构造
  23. SwitchExpression aiSwvExp = Expression.Switch(
  24. aiSwvP // switch (i)
  25. , Expression.Call(
  26. null,
  27. typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
  28. Expression.Constant("鼓励奖")
  29. ) //default 默认事例,此参数没有代码无默认事例
  30.  
  31. , new SwitchCase[] { //事例 之一,前部分是执行,后部分是合符条件值(与)
  32.  
  33. Expression.SwitchCase( Expression.Call(
  34. null,
  35. typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
  36. Expression.Constant("一等奖") )
  37. , Expression.Constant() //case 1
  38. )
  39. ,Expression.SwitchCase(
  40. Expression.Call(
  41. null,
  42. typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
  43. Expression.Constant("二等奖") ),
  44. Expression.Constant() //case 2
  45. )
  46. ,Expression.SwitchCase(
  47. Expression.Call(
  48. null,
  49. typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
  50. Expression.Constant("三等奖") )
  51. ,Expression.Constant() //case 3
  52. )
  53. });
  54.  
  55. // The following statement first creates an expression tree,
  56. // then compiles it, and then runs it.
  57. Expression.Lambda<Action>(switchExpr).Compile()();
  58.  
  59. Expression.Lambda<Action<int>>(aiSwvExp, aiSwvP).Compile().DynamicInvoke();

输出:
     二等奖

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

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

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

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

    一.BlockExpression类:表式一个包含可在其中定义变量的表达式序列的块.是一组表达式,类似于多个委托的 += 后的效果,其返回表达式是最后一个表达式决定.以下是BlockExpressio ...

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

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

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

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

  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. h.264并行解码算法3D-Wave实现(基于多核共享内存系统)

    3D-Wave算法是2D-Wave的扩展.3D-Wave相对于只在帧内并行的2D-Wave来说,多了帧间并行,不用等待前一帧完成解码后才开始下一帧的解码,而是只要宏块的帧间参考部分以及帧内依赖宏块解码 ...

  2. BZOJ1602: [Usaco2008 Oct]牧场行走

    1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1084  Solved: 556[Submit][St ...

  3. web页面布局思想

    一.盒子模型 网页可以看成由一个个"盒子"组成,如图: 由上图可以看出,页面分为上(网站导航).中.下(版权声明)三个部分,中间部分又分为左(商品分类).中(主要部分).右,这些版 ...

  4. 《Linear Algebra and Its Applications》-chaper6-正交性和最小二乘法- 格拉姆-施密特方法

    构造R^n子空间W一组正交基的算法:格拉姆-施密特方法.

  5. 利用Trie树对字符串集合进行排序并计算特征值

    该算法用于将一组乱序的字符串反序列化到一个Trie树中,这个过程即可视为对字符串进行了一次排序. 还可以通过调用 GetFeatureString 将该 Trie 树重新序列化. #include & ...

  6. asterisk 能打电话的配置

    若使用的是chan_sip.so模块,则在sip.conf里添加: [10]type=friend;context=phonescontext=publichost=dynamicsecret=123 ...

  7. hive UDAF源代码分析

    sss /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license a ...

  8. 从客户端(MuliteTextBox2="<a href="http://www....")中检测到有潜在危险的 Request.Form 值

    由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值.立马报出“从客户端 中检测到有潜在危险的Request.Form值”这样的错.   解决方案一: ...

  9. XML认识

    XML概念 XML是eXtensible Markup Langguage 缩写,称之为可扩展标记语言.XML 被设计用来传输和存储数据.与HTML不同的是: HTML被设计用来显示数据,其焦点是数据 ...

  10. 一个可视化的retrospective网站

    IdeaBoardz - Brainstorm, Retrospect, Collaborate是一个可视化的retrospective,brainstorm的网站,比较简单易用,可以导出pdf和ex ...