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

  ConstantExpression使用比较简单,如Expression constantExpr = Expression.Constant(100);

二、MemberExpression:表示访问字段或属性。相对来说也是一个比较简单的表达式了,主要是对 字段或属性 的包装

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions; namespace ConsoleApplication2
{
class Program
{
class MyUser
{
public string Name;
public int Age { get; set; }
} static void Main(string[] args)
{
MyUser user = new MyUser { Name = "马七", Age = }; #region 字段实例调用
Console.WriteLine("当前用户 姓名:{0} 年龄 {1} 岁", user.Name, user.Age);
MemberExpression mbExp = Expression.Field(Expression.Constant(user), "Name");
Console.WriteLine(mbExp.ToString());
Console.WriteLine(Expression.Lambda(mbExp).Compile().DynamicInvoke());
#endregion
//以上输出
//value(ConsoleApplication2.Program+MyUser).Name
//马七 #region Lambda表达式
List<MyUser> users = new List<MyUser>();
users.Add(new MyUser { Name = "张三", Age = });
users.Add(new MyUser { Name = "李四", Age = });
users.Add(new MyUser { Name = "王五", Age = });
users.Add(new MyUser { Name = "刘六", Age = });
user = users.Where(s => s.Name == "张三").FirstOrDefault();
Console.WriteLine("当前用户 姓名:{0} 年龄 {1} 岁", user.Name, user.Age);
#endregion
//以上输出
//当前用户 姓名:张三 年龄 20 岁 //**********************************
//组合如 s => s.Name == "张三" 的表达式
//**********************************
#region Lambda表达式 使用字段
ParameterExpression paramExpr = Expression.Parameter(typeof(MyUser), "o");
MemberExpression namePropExpr = Expression.Field(paramExpr, "Name"); //字段
BinaryExpression binExp = Expression.Equal(namePropExpr, Expression.Constant("李四"));
LambdaExpression laExp = Expression.Lambda(binExp, paramExpr);
Func<MyUser, bool> func = (Func<MyUser, bool>)laExp.Compile();
user = users.Where(func).FirstOrDefault();
Console.WriteLine(binExp.ToString());
Console.WriteLine(laExp.ToString());
Console.WriteLine("当前用户 姓名:{0} 年龄 {1} 岁", user.Name, user.Age);
#endregion
//以上输出
//(o.Name == "李四")
//o => (o.Name == "李四")
//当前用户 姓名:李四 年龄 23 岁 #region Lambda表达式 使用属性
namePropExpr = Expression.Property(paramExpr, "Age");
binExp = Expression.Equal(namePropExpr, Expression.Constant());
laExp = Expression.Lambda(binExp, paramExpr);
func = (Func<MyUser, bool>)laExp.Compile();
user = users.Where(func).FirstOrDefault();
Console.WriteLine(binExp.ToString());
Console.WriteLine(laExp.ToString());
Console.WriteLine("当前用户 姓名:{0} 年龄 {1} 岁", user.Name, user.Age);
#endregion
//以上输出
//(o.Age == 36)
//o => (o.Age == 36)
//当前用户 姓名:王五 年龄 36 岁
Console.ReadLine(); }
}
}

三、NewExpression :表示构造函数调用。

如果调用的类是实例类,这个就非常有用,特别是在调用方法表达式时,MethodCallExpression的第一个参数如果是实例类,这要用NewExpression来创建一个实例对象调用其方法,静态类时,用null。使用时, 用Expression.New(类型)就可以创建了。

四、MethodCallExpression:表示对静态方法或实例方法的调用。 这个用是比较多,也在这系列中用的多,就不单独举例。

五、UnaryExpression :表示包含一元运算符的表达式。

如:

     // -100
UnaryExpression aiU1 = Expression.Negate(Expression.Constant());
Console.WriteLine(aiU1.ToString()); //Not(Ture)
UnaryExpression aiU2 = Expression.Not(Expression.Constant(true));
Console.WriteLine(aiU2.ToString()); //() => 123456
UnaryExpression aiU3 = Expression.Quote(Expression.Lambda( Expression.Constant()));
Console.WriteLine(aiU3.ToString()); //(123456 As Nullable`1)
UnaryExpression aiU4 = Expression.TypeAs(Expression.Constant(), typeof(int?));
Console.WriteLine(aiU4.ToString()); //Convert(123456)
UnaryExpression aiU5 = Expression.Convert(Expression.Constant(), typeof(Int16));
Console.WriteLine(aiU5.ToString());
//+123456
UnaryExpression aiU6 = Expression.UnaryPlus(Expression.Constant());
Console.WriteLine(aiU6.ToString());

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

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

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

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

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

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

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

  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. [HDOJ 5183] Negative and Positive (NP) 【Hash】

    题目链接:HDOJ - 5183 题目分析 分两种情况,奇数位正偶数位负或者相反. 从1到n枚举,在Hash表中查询 Sum[i] - k ,然后将 Sum[i] 加入 Hash 表中. BestCo ...

  2. Git简明手册

    文/AbnerKang(简书作者)原 文链接:http://www.jianshu.com/p/d7a7ba4f2341?utm_campaign=maleskine& utm_content ...

  3. 利用no_merge优化

    SQL> select a.unit3_code 机构编码, 2 a.unit3_name 机构名称, 3 a.dept1_code 部门编码, 4 a.dept1_name 部门名称, 5 a ...

  4. Spark RDD Persistence

    Spark最为重要的特性之一就是可以在多个操作(Action)之间,将一个或多个RDD关联的数据集(Dataset)以分区(Partition)为单位进行持久化(Persist)或缓存(Cache), ...

  5. 解决导入lib,关联源码问题

    关联源代码:在libs目录下新建文件,以jar包全名(包括.jar)为文件名称,以.properties结尾 在文件中新建键值对:src=jar包源代码绝对路径:根据提示将单斜线变成双斜线, 然后cl ...

  6. lazyman学习

    1.安装: gem install lazyman 2.建立工程: cd到工程目录下 lazyman new 工程名 3.打开调试命令 lazyman c lazyman调用selenium-webd ...

  7. Debian添加软件源

    安装完渗透测试系统kali linux后,默认的只有security这个源,只更新那些集成的安全软件,不能安装其他新软件,官网给出了3类源: Kali Linux提供了3类软件源,这些源在世界各地都有 ...

  8. hdu 1081 矩阵最大连续子序列

    问题描述:二位平面图,每一个坐标都有值,正值或负值,求任意矩形中和的最大值问题 解决方案:求解图中每一个坐标为起点,求任意长度宽度的矩形的和 #include<iostream> #inc ...

  9. SRM 410(1-250pt, 1-500pt)

    DIV1 250pt 题意:对于图G,有一些点和边,点中有一些点称为特殊点.问在所有特殊点最终不能处于同一个联通块的条件下,最多能给在图G中添加多少条边. 解法:首先,对于图G,处理出它有哪些联通块, ...

  10. java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误

    java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误. 问题: 创建了一个工 ...