表达式:使用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 < ...
随机推荐
- Arrays.fill方法的陷阱
昨晚调试程序时发现的,该方法不能初始化二维数组,不过当时没有报CE,提交的时候也是WA:今早上单独测试该方法,也没有CE,不过运行时异常.切记
- XP系统VPN设置
为了解除公司上网策略限制,或者为了上Google,Facebook,都可以通过设置VPN实现. 要使用VPN需要到VPN服务商注册,链接VPN服务商. ======================== ...
- linux下常用网络操作汇总
首先说明下RHEL6下设置IP地址的确和RHEL5下有几点是不同的. 我装完RHEL6中默认选择的是DHCP自动获取方式: [root@localhost ~]# vi /etc/sysconfig/ ...
- Haskell 输入和输出
我们已经说明了 Haskell 是一个纯粹函数式语言.虽说在命令式语言中我们习惯给电脑执行一连串指令,在函数式语言中我们是用定义东西的方式进行.在 Haskell 中,一个函数不能改变状态,像是改变一 ...
- log4j将日志输出到控制台,文件,邮件
#将日志写到文件 log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.File=e\:\ ...
- WordPress wp-includes/functions.php脚本远程任意代码执行漏洞
漏洞名称: WordPress wp-includes/functions.php脚本远程任意代码执行漏洞 CNNVD编号: CNNVD-201309-166 发布时间: 2013-09-13 更新时 ...
- 495. Kids and Prizes
http://acm.sgu.ru/problem.php?contest=0&problem=495 学习:当一条路走不通,换一种对象考虑,还有考虑对立面. 495. Kids and Pr ...
- Unity3d 基于物理渲染Physically-Based Rendering之实现
根据前文的例子http://blog.csdn.net/wolf96/article/details/44172243(不弄超链接了审核太慢)弄一下真正的基于物理的渲染逃了节课= =,弄了一下.公式和 ...
- lightoj1017 dp
题目链接:http://lightoj.com/volume_showproblem.php?problem=1017 #include <cstdio> #include <cst ...
- poj 2631 Roads in the North【树的直径裸题】
Roads in the North Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2359 Accepted: 115 ...