(转)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,只有用户名中一部字符,或者全部都有. ...
随机推荐
- 题目1539:师弟 ——最短路+DFS
题意::从起点到终点的所有的最短路中,找出离终点有X个路口的城市一共有几个 开始我用最短路+DFS从起点开始搜,超时了 换了一种方法,从终点开始搜,AC #include<stdio.h> ...
- Java基础数据类型二进制转换
前言: 本文主要介绍java基础类型的二进制转换和二进制的基本概念. 二进制: 1,二进制是以0和1为码,逢2进1,比如3=11=1*2+1. 2,在计算机当中其它进制的算法基本基于2进制,因为计算机 ...
- MinGW下载并配置gcc/g++编译环境
本文将讲解如何下载MinGW并配置gcc\g++编译环境 一.下载MinGW 在MinGW官网中下载“mingw-get-setup.exe” 官网传送门:http://www.mingw.org/ ...
- 1092 To Buy or Not to Buy
题意:给出两个字符串s1和s2(长度不超过1000),问s1是否包含s2中的所有字符,若包含,则输出Yes,并输出s1中多余的字符个数:若不完全包含,则输出No,并输出缺少的个数. 思路:定义数组in ...
- git的分布式和集中式
当然,Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面.
- Unity3D 4.3在Windows下打包iOS资源
想当年,想弄iOS的版本必须弄台mac机器,虽然一开始要弄iOS的时候觉得在mac上开发感觉挺高富帅的,但是做多了之后就觉得在mac上开发各种不方便.现在好了,Unity3D 4.3开始支持在Wind ...
- 基于Nfs和Samba的Lamp环境实现
一 系统环境二 网络文件系统与web环境的结合三 搭建lamp环境四 实现nfs服务五 实现samba服务六 实现效果 一 系统环境 系统平台:CentOS release 6.8 (Final) L ...
- mysql字符类型
字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定 ...
- VMware80端口映射
目标是外网访问80端口,然后映射到虚拟机的80端口,80映射到80. 1.首先80端口是最常用的端口,要确认主机80端口是否被占用,如果被占用,停止或者修改占用80端口程序. 2.80端口默认防火墙是 ...
- rainyday.js
/** * Defines a new instance of the rainyday.js. * @param options options element with script parame ...