一、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 3994 约数个数和

    Description 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求\[\sum_{i=1}^{N}\sum_{j=1}^{M}d(ij)\]. Input 输入文件包含多组测试数 ...

  2. BuzzSumo:什么样的文章能获得疯转?(基于1亿篇文章大数据分析)

    BuzzSumo:什么样的文章能获得疯转?(基于1亿篇文章大数据分析) 社交媒体追踪服务分析工具BuzzSumo,2014年5月前后对社交媒体上超过1亿篇文章进行了分析,试图找出一个答案: 什么样的内 ...

  3. 一个短路求值引起的一个小bug

    今天在写一个判断字符串是否回文时因为短路求值问题导致了一个bug,记录如下: 代码如下 bool isPal(char str[],int len) { int begin=0; int end=le ...

  4. js backbone

    http://www.the5fire.com/backbone-js-tutorials-pdf-download.html http://www.infoq.com/cn/articles/mob ...

  5. 应用安全技术趋势之 Top 5

    而今,大多数应用都依赖于像入侵防护系统(Instrusion Prevention System)和 Web 应用防火墙(Web Application Firewall,以下全文简称 WAF)这样的 ...

  6. codeforces D. Multiplication Table

    http://codeforces.com/contest/448/problem/D 题意:一个n×m的矩阵,a[i][j]=i*j; 然后把a数组排序,找出第k个数. 思路:1-n×m二分枚举,然 ...

  7. 迅雷创始人程浩:创业公司5招做好内部创新(组建小型敢死队:一共3个人,一个产品经理,两个研发;腾讯做不做这个项目是一个伪命题;让用户来验证,而不是相反 good)

    欢迎关注“创事记”的微信订阅号:sinachuangshiji 文/程浩 编者按:本文首发于微信公众号“浩哥说”(ID:haogetalks),作者程浩,迅雷创始人.内容为作者在混沌AI成长营上的演讲 ...

  8. 两种QMultiMap的遍历方法(最好使用只读遍历器)

    留个爪,备查 QMultiMap<QString, QString>& remote_map = my_obj->m_MapVersion; // ccc 这里体现了引用的好 ...

  9. 与QString("我是中文")完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。

    在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的 ...

  10. 如何查看jar包的版本号?

    jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看   打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个 ...