一、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())
, Expression.Assign(aiP2, Expression.Constant())
, 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() //case 1
)
,Expression.SwitchCase(
Expression.Call(
null,
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
Expression.Constant("二等奖") ),
Expression.Constant() //case 2
)
,Expression.SwitchCase(
Expression.Call(
null,
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
Expression.Constant("三等奖") )
,Expression.Constant() //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();

输出:
     二等奖

表达式:使用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. BZOJ 3676 回文串

    Description 考虑一个只包含小写拉丁字母的字符串\(s\).我们定义\(s\)的一个子串\(t\)的"出现值"为\(t\)在\(s\)中的出现次数乘以\(t\)的长度.请 ...

  2. Nodejs异步

    http://cnodejs.org/topic/4f16442ccae1f4aa2700113b http://cnodejs.org/topic/4f16442ccae1f4aa27001123 ...

  3. MVC自学系列之一(MVC入门篇)

      MVC是如何适用于ASP.NET中的 自从2002年ASP.NET 1.0版本的首次发布,就知道ASP.NET和Web Forms是同样一回事.ASP.NET由抽象两层类所支持: -->Sy ...

  4. mysql中TimeStamp和Date的转换

    mysql 查询时间戳(TIMESTAMP)转成常用可读时间格式 from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接 ...

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

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

  6. c++ 名字粉碎(name mangling)

    转自Ibm: Name mangling is the encoding of function and variable names into unique names so that linker ...

  7. magic c c++ unix 注册机 注册码 破解版 下载

    说起来都是伤心的事情前段时间,忙于找工作,面试的公司和入职的公司,想想都觉得很奇葩,其中有一家叫什么湖南普天科技有限公司的,他们是从国防科大接项目做的,那天他们叫我去面试,面试完了,说我们这里有个c+ ...

  8. -_-#gb2312解码

    百度视频采用gb2312编码,点击出来的链接中的中文转成了gb2312,而gb2312无法解码 如果链接中的中文直接utf-8编码,就没问题,但编辑后台有长度限制 关于URL编码 JS(Unicode ...

  9. 【转】MFC下拉列表框的用法

    原文网址:http://blog.csdn.net/kinglimy/article/details/6452239 Combo Box (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是 ...

  10. 关于java、Android中Math的一些用法

    java.math.Math类常用的常量和方法: Math.PI 记录的圆周率Math.E记录e的常量Math.abs 求绝对值Math.sin 正弦函数 Math.asin 反正弦函数Math.co ...