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


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

    使用:

                ParameterExpression aiP1 = Expression.Parameter(typeof(int), "a"); //(1)
                ParameterExpression aiP2 = Expression.Parameter(typeof(int), "b");
                ParameterExpression aiP3 = Expression.Parameter(typeof(int));
                Console.WriteLine(aiP3.ToString());
            //输出:Param_0
                BinaryExpression aiBnExp = Expression.MakeBinary(ExpressionType.Equal,
                                       aiP1,
                                       aiP2);
    
                ConditionalExpression aiCdExp = Expression.Condition(
                               aiBnExp,
                               Expression.Constant("a和b相等"),
                               Expression.Constant("a与b不相等")
                             );  //(2)
    
                Console.WriteLine(aiCdExp.ToString());
                //输出:IIF((a == b), "a和b相等", "a与b不相等")
    
                LambdaExpression aiLamExp = Expression.Lambda(
                    Expression.Block   //(3)
                    (
                       new ParameterExpression[] { aiP1, aiP2 }
                       , Expression.Assign(aiP1, Expression.Constant(10))
                       , Expression.Assign(aiP2, Expression.Constant(30))
                       , aiCdExp
    
                    ));
                Console.WriteLine(aiLamExp.Compile().DynamicInvoke());
    
                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 来处理多重选择。

            //构建类似下列代码的表达式
                //int i = 1;
                //switch (i)
                //{
                //    case 1:
                //        Console.WriteLine("一等奖");
                //        break;
                //    case 2:
                //        Console.WriteLine("二等奖");
                //        break;
                //    case 3:
                //        Console.WriteLine("三等奖");
                //        break;
                //    default:
                //        Console.WriteLine("鼓励奖");
                //        break;
                //}
    
                //声明 SwitchCase 的称值参数,相当于 switch (i)
                ParameterExpression aiSwvP = Expression.Parameter(typeof(int), "i");
    
                //构造
                SwitchExpression aiSwvExp = Expression.Switch(
                    aiSwvP   // switch (i)
                    , Expression.Call(
                        null,
                        typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                        Expression.Constant("鼓励奖")
                    )  //default 默认事例,此参数没有代码无默认事例
    
                    , new SwitchCase[] {  //事例 之一,前部分是执行,后部分是合符条件值(与)
    
                       Expression.SwitchCase(  Expression.Call(
                        null,
                        typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                        Expression.Constant("一等奖") )
                    , Expression.Constant(1)   //case 1
                )
                ,Expression.SwitchCase(
                    Expression.Call(
                        null,
                        typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                        Expression.Constant("二等奖")  ),
                    Expression.Constant(2)  //case 2
                )
                ,Expression.SwitchCase(
                    Expression.Call(
                        null,
                        typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
                        Expression.Constant("三等奖")  )
                        ,Expression.Constant(3) //case 3         
                        )               
                    });
    
                // The following statement first creates an expression tree,
                // then compiles it, and then runs it.
                Expression.Lambda<Action>(switchExpr).Compile()();
    
    
                Expression.Lambda<Action<int>>(aiSwvExp, aiSwvP).Compile().DynamicInvoke(2);

    输出:
         二等奖

  • 相关阅读:
    dependencies 和 devDependencies 区别
    safari下地址跳转bug
    forEach,map和filter的区别
    设置video标签的默认样式
    还不懂移动端适配快看这篇文章
    使用微信帐号登录网站的实现
    基于阿里云市场API服务实现增值税发票识别【OCR】
    词云wordcloud的实现
    数据统计的简单实现思路
    京东联盟API简易PHP接口类
  • 原文地址:https://www.cnblogs.com/athinker/p/3600499.html
Copyright © 2020-2023  润新知