表达式:使用API创建表达式树(6)
一、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)的更多相关文章
- 表达式:使用API创建表达式树(3)
一.DebugInfoExpression:发出或清除调试信息的序列点. 这允许调试器在调试时突出显示正确的源代码. static void Main(string[] args) { var asm ...
- 表达式:使用API创建表达式树(2)
一.BlockExpression类:表式一个包含可在其中定义变量的表达式序列的块.是一组表达式,类似于多个委托的 += 后的效果,其返回表达式是最后一个表达式决定.以下是BlockExpressio ...
- 表达式:使用API创建表达式树(1)
表达式树可使用Expressions类的静态工厂方法来创建.这种用API的方式创建给予我们在编程极大的灵活性,MSDN上关于表达式的例子也不少,但在使用过程中还是会遇到许多麻烦,对有的表达式类,介绍得 ...
- 表达式:使用API创建表达式树(5)
一.ConditionalExpression:表达式 生成如 IIF((a == b), "a和b相等", "a与b不相等") 式子. 使用: Paramet ...
- 表达式:使用API创建表达式树(4)DynamicExpression
DynamicExpression:表示动态操作.这个网上可见的资料少得可怜,但想到MVC和第三方的动态语言能在NET运行.好奇的倒腾了下 先声明两个类(有相同的方法和字段,但不是继承于同一接口的类) ...
- EF4.0、4.3创建表达式树状动态查询总结
---------------------------------------------快速适用 效果: where name like '%王%' and Age>=35 or Age< ...
- 【C#表达式树 五】工厂模式创建表达式树节点
常量 1.值常量 (p)=>100+88+p ParameterExpression par = Expression.Parameter(typeof(int), "p" ...
- [C# Expression] 之动态创建表达式
上一篇中说到了 Expression 的一些概念性东西,其实也是为了这一篇做知识准备.为了实现 EFCore 的多条件.连表查询,简化查询代码编写,也就有了这篇文章. 在一些管理后台中,对数据进行 ...
- NX二次开发-NX11创建表达式组NXOpen::ExpressionGroup
NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_part.h> #include < ...
随机推荐
- [BZOJ 1115] [POI2009] 石子游戏Kam 【阶梯博弈】
题目链接:BZOJ - 1115 题目分析 首先看一下阶梯博弈: 阶梯博弈是指:初始有 n 堆石子,每次可以从任意的第 i 堆拿若干石子放到第 i - 1 堆.最终不能操作的人失败. 解法:将奇数位的 ...
- iPhone开发 - 常用库
iPhone开发 - 常用库 这里总结了iPhone开发者开发过程中可能需要的一些资源 如何用Facebook graphic api上传视频: http://developers.facebook. ...
- 用 Webgoat 撬动地球,看安全测试的引路石!
测试工程师是很多人迈进软件行业的起点.从负责很小的局部到把握整个产品的质量,每个人花费的时间长短不一--从功能到性能.可用性到容错性.从兼容性到扩展性.稳定性到健壮性--方方面面逐渐做广做深. 不过, ...
- jQuery EasyUI parser 的使用场景
转自原文地址:http://www.easyui.info/archives/216.html parser,故名意思,就是解析器的意思,别看他只有那么几行代码,jQuery Easyui 能够根据c ...
- Spark PySpark数据类型的转换原理—Writable Converter
Spark目前支持三种开发语言:Scala.Java.Python,目前我们大量使用Python来开发Spark App(Spark 1.2开始支持使用Python开发Spark Streaming ...
- 使用Struts2开发Java Web应用程序(目录)
连接地址 http://blog.csdn.net/struts2/article/details/1721752
- Eclipse添加快速查找Dao中方法所对应的Mybatis XML映射SQL的插件
Dao关联Mybatis快速查找的插件安装地址:http://dl.bintray.com/harawata/eclipse 安装步骤: ①Eclipse ==> Help ==> Ins ...
- Snake - SGU 128(构造多边形)
题目大意:有N个点,如果可以使用这N个点连接,连接的时候任意两条边要成直角,任意边都要平行于x轴或者y轴,并且不能出现跨立相交,最终组成一个闭合的多边形,求出来这个多边形的最小长度. 分析:容易证明这 ...
- first blog编程之美-----计算1的个数
根据以下总结写出以下程序,总结来源于网上 感想:得硬着头皮找规律 #include int count1(int n) { int i=1; int count=0 ...
- linux —— shell 编程(编程语法)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...