一、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. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  2. Reporting Services 钻取报表、子报表

    一.钻取报表 1.概念 钻取报表是指用户通过单击其他报表中的链接打开的报表.钻取报表通常包含某原始汇总报表中所包含的某项的详细信息. 例如,在此图中,销售额汇总报表列出了销售订单和总额.当用户单击该汇 ...

  3. Greg and Array

    Codeforces Round #179 (Div. 2) C:http://codeforces.com/problemset/problem/296/C 题意:给你一个序列,然后有两种操作,第一 ...

  4. 使用2to3将代码移植到Python 3-转

    http://m.blog.csdn.net/blog/merryken/9104199# ❝ Life is pleasant. Death is peaceful. It’s the transi ...

  5. MYSQL常用命令集合

    1.导出整个数据库 mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1) mysqld ...

  6. css li 列表

    ul,li{list-style-type:none;padding:0;margin:0}

  7. bzoj1954 poj3764

    对于xor有一个非常重要的性质A xor B xor B=A 并且满足交换律和结合律这道题是求无根树上最长的xor路径我们知道,无根树的题目我们都是要想办法转化为有根树来处理当我们确定了一个根,根到每 ...

  8. 余弦距离、欧氏距离和杰卡德相似性度量的对比分析 by ChaoSimple

      1.余弦距离 余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量. 向量,是多维空间中有方向的线段,如果两个向量的方向一致,即夹角接近零,那么这两个向 ...

  9. 成为Web开发人员的7个简单步骤

    你想成为一名 Web 开发人员,但现在你面前有这样一个问题,那就是你没有在高科技行业工作的经验.你上了一些课程,也花了时间在个人编码项目上,但是你的简历上关于“经验”的部分仍然不为企业承认.过渡到一个 ...

  10. smtp服务器搭建(实现本地通讯)

    1安装postfix 1)下载安装包    sudo apt-get install postfix 2)配置服务器 选择确定. 选择IneternetSite(通过SMTP发送和接收邮件),然后确定 ...