(转)Expression 表达式树学习整理
原文地址:http://www.cnblogs.com/li-peng/p/3154381.html
整理了一下表达式树的一些东西,入门足够了
先从ConstantExpression 开始一步一步的来吧 它表示具有常量值的表达式
我们选建一个控制台应用程序
ConstantExpression _constExp = Expression.Constant("aaa",typeof(string));//一个常量 //Console.Writeline("aaa"); MethodCallExpression _methodCallexp=Expression.Call(typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)}),_constExp); Expression<Action> consoleLambdaExp = Expression.Lambda<Action>(_methodCallexp); consoleLambdaExp.Compile()(); Console.ReadLine(); |
下边的MethodCallExpression你也许不知道是什么回事,不要急我下边会详细讲的,这相当于
Console.WriteLine("aaa"); 输出一个常量,看一下结果

如果想自己输入一个值输出呢,那就用ParameterExpression 它表示一个参数表达式,我们只要把上边的代码做一下小改动就行
ParameterExpression _parameExp = Expression.Parameter(typeof(string), "MyParameter"); MethodCallExpression _methodCallexpP = Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), _parameExp); Expression<Action<string>> _consStringExp = Expression.Lambda<Action<string>>(_methodCallexpP, _parameExp); _consStringExp.Compile()("Hello!!"); |
参数parameExp就是一个string类型的变量我们让它输出一个Hello!!

有点感觉了吧,慢慢来好玩的还在后边,现在我们就说一下MethodCallExpression它可以调用静态方法和实例方法,我们上边的代码就是调用 的静态方法
,我先讲一下调用静态方法,再讲调用实例方法。
我们建一个返回string的静态方法,传入一个object类型的值
public static string ConsStr(object str) { string _str = str + "aa"; Console.WriteLine(_str); return _str; } |
看一下我们是怎么调用自己的静态方法的
ParameterExpression _paraObj = Expression.Parameter(typeof(object), "objPara"); MethodCallExpression _MyStateMethod = Expression.Call(typeof(Program).GetMethod("ConsStr", new Type[] { typeof(object) }), _paraObj); Expression<Func<object, string>> _meyLambdaState = Expression.Lambda<Func<object, string>>(_MyStateMethod, _paraObj); string s_tr = _meyLambdaState.Compile()("ni Hao"); Console.WriteLine("返回值: " + s_tr); |
new Type[] { typeof(object) } 就是我们的方法里的参数类型,后边的paraObj是相当于参数值了,如果 是多参数就在 Type[],和后边再加上相应 的类型和参数就行
静态方法你有些了解了,下面讲一下调用实例方法
我们写一个非静态方法
public string ConsStr2(object str) { string _str = str + "aa"; Console.WriteLine(_str); return _str; } |
调用的时候只要把上边的代码改动一点就ok Expression.Call为我们提供了我们想要的重载
Program _pg = new Program(); ParameterExpression _paraObj2 = Expression.Parameter(typeof(object), "objPara"); MethodCallExpression _MyStateMethod2 = Expression.Call(Expression.Constant(_pg), typeof(Program).GetMethod("ConsStr2"), _paraObj2); Expression<Func<object, string>> _meyLambdaState2 = Expression.Lambda<Func<object, string>>(_MyStateMethod2, _paraObj2); string s_tr2 = _meyLambdaState.Compile()("you shi ni "); Console.WriteLine("返回值: " + s_tr2); |
简单吧。
再下来我们讲什么呢,也许你猜到了UnaryExpression一元运算符表达式和 BinaryExpression 二元运算符表达式
我们先看一个这两个表达式的简单例子后,我们再做一个复杂的例子
UnaryExpression我们做一个5--的表达式
ConstantExpression _consNum = Expression.Constant(5, typeof(int)); UnaryExpression _unaryPlus = Expression.Decrement(_consNum); Expression<Func<int>> _unaryLam = Expression.Lambda<Func<int>>(_unaryPlus); Console.WriteLine(_unaryLam.Compile()()); |

BinaryExpression 我们做一个a+b的例子
ParameterExpression _ParaA = Expression.Parameter(typeof(int), "a"); ParameterExpression _ParaB = Expression.Parameter(typeof(int), "b"); BinaryExpression _BinaAdd = Expression.Add(_ParaA, _ParaB); Expression<Func<int, int, int>> _MyBinaryAddLamb = Expression.Lambda<Func<int, int, int>>(_BinaAdd, new ParameterExpression[] { _ParaA, _ParaB }); Console.WriteLine("表达式: "+ _MyBinaryAddLamb); Console.WriteLine(_MyBinaryAddLamb.Compile()(3, 6)); |
不难吧,
我们做一把两个表达式放一起做一个例子吧 (a+b)*(--c)
ParameterExpression _ParaA = Expression.Parameter(typeof(int), "a"); ParameterExpression _ParaB = Expression.Parameter(typeof(int), "b"); BinaryExpression _BinaAdd = Expression.Add(_ParaA, _ParaB); //a+b ParameterExpression _paraC = Expression.Parameter(typeof(int), "c"); UnaryExpression _paraDecr = Expression.Decrement(_paraC); //(a+b)*(--c) BinaryExpression _binaMultiply = Expression.Multiply(_BinaAdd, _paraDecr); Expression<Func<int, int, int, int>> _MyBinaryLamb = Expression.Lambda<Func<int, int, int, int>>(_binaMultiply, new ParameterExpression[] { _ParaA, _ParaB, _paraC }); Console.WriteLine("表达式: "+ _MyBinaryLamb); Console.WriteLine(_MyBinaryLamb.Compile()(3, 6, 5)); |

今天就讲到这
(转)Expression 表达式树学习整理的更多相关文章
- Expression 表达式树学习整理
整理了一下表达式树的一些东西,入门足够了 先从ConstantExpression 开始一步一步的来吧 它表示具有常量值的表达式 我们选建一个控制台应用程序 ConstantExpression _ ...
- 介绍一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql
一.Expression2Sql介绍 Expression2Sql是一个可以将Expression表达式树解析成Transact-SQL的项目.简单易用,几分钟即可上手使用,因为博主在设计Expres ...
- 委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底
本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function&l ...
- .net 系列:Expression表达式树、lambda、匿名委托 的使用
首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: public static strin ...
- .net 系列:Expression表达式树、lambda、匿名委托 的使用【转】
https://www.cnblogs.com/nicholashjh/p/7928205.html 首先定义一个泛型委托类型,如下: public delegate T Function<T& ...
- Expression表达式树(C#)
Lambda表达式: 1.下面举例通过Lambda表达式创建了一个用于验证Name的Func委托. //通过Lambda表达式创建一个对象的Name属性验证委托 Func<SearchInfo, ...
- .NET技术-6.0. Expression 表达式树 生成 Lambda
.NET技术-6.0. Expression 表达式树 生成 Lambda public static event Func<Student, bool> myevent; public ...
- Expression表达式树
表达式树表示树状数据结构的代码,树状结构中的每个节点都是一个表达式,例如一个方法调用或类似 x < y 的二元运算 1.利用 Lambda 表达式创建表达式树 Expression<Fun ...
- 关于Expression表达式树的拼接
最近在做项目中遇到一个问题,需求是这样的: 我要对已经存在的用户进行检索,可以根据用户的id 或者用户名其中的一部分字符来检索出来,这样就出现了三种情况 只有id,只有用户名中一部字符,或者全部都有. ...
随机推荐
- wordpress改不了固定连接的解决办法
经常遇到更改了固定连接刷新没效果>>>>>>>废话不多说直接上步骤,有图有真相. 1,ftp删除根目录的这个文件夹 2,进入wp后台设置-固定连接—自定义结构 ...
- Linux 输入子系统 input
一.输入子系统 针对输入设备设计:触摸屏.键盘.按键.传感器.鼠标...... 二.每种设备都属于字符设备驱动,程序的写法步骤也相同 1.实现入口函数 xxx_init() 和卸载函数 xxx_exi ...
- FPGA前世今生(二)
上期我们介绍了关于FPGA内部最基本的结构,在quartus下可以看到整体的结构. 这是在平面规划图下看到的结构,其中蓝色的小格代表一个LAB.四周边上浅棕色的小格代表IO口. 这是一个LAB的内部结 ...
- Oracle LSNRCTL------监听器的启动和关闭
对于DBA来说,启动和关闭oracle监听器是很基础的任务,但是Linux系统管理员或者程序员有时也需要在开发数据库中做一些基本的DBA操作,因此了解一些基本的管理操作对他们来说很重要. 本文将讨论用 ...
- Linux:远程连接 SSH
一.认识 SSH 定义 SSH(Secure shell):安全外壳协议:是建立在应用层基础上的安全协议: 通过 SSH 进行服务端连接,不容易被窃取信息: 连接服务器 ssh 服务器名 + @ + ...
- FTP文件传输协议两种模式 ftp协议集,错误码集,ftp客户端命令集
TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20.FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置.联接的方式.甚至是是否使用相同的操 ...
- 1060 Are They Equal
题意: 给出两个浮点数(最大不超过10^100),以及存储的有效位数,判断这两个数是否相等.如12300和12358.9若存储的有效位数为3,则均表示为0.123*10^5,因此视为相等. 思路:[字 ...
- tomcat 1字节的UTF-8序列的字节1无效
微信支付时, 命名返回支付成功, 但是成功后却返回如下的错误, 在测试环境都是没有任何问题, 到客户现场后, 可能客户现场使用的4G网络, 用微信支付时一直报这样的错误 错误现象: com.sun.o ...
- MFC学习(六)计算器
1 stdafx.h 所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H.Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使 ...
- C Primer Plus学习笔记(十)- 字符串和字符串函数
getchar() 和 putchar() getchar() 函数不带任何参数,它从输入队列中返回下一个字符 下面的语句读取下一个字符输入,并把该字符的值赋给变量 ch ch =getchar(); ...