C# Expression表达式笔记
整理了一下表达式树的一些东西,入门足够了
先从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+bParameterExpression _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)); |

今天就讲到这
C# Expression表达式笔记的更多相关文章
- 【学习笔记】Expression表达式目录树
Expression表达式目录树:一个能拼装能解析的数据结构,语法树. 一.手动拼装表达式目录树 示例1: /// <summary> /// 展示表达式树,协助用的 /// 编译lamb ...
- Struts中的OGNL和EL表达式笔记
Struts中的OGNL和EL表达式笔记 OGNL(Object-Graph Navigation Language),可以方便的操作对象属性的表达式语言. 1.#符号的用途 一般有三种方式: 1.1 ...
- 介绍一个可以将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 ...
- 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)
一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...
- .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, ...
- 整理:C#中Expression表达式的妙用
原文:整理:C#中Expression表达式的妙用 一.目的:通过示例了解C#中Expression表达式的作用,通过表达式和反射可以写出很优雅的代码和架构,也可以完成一些看似不可能完成的任务 二.示 ...
随机推荐
- js 基础对象一
JavaScript 通常用于操作 HTML 元素. Document元素 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页 ...
- LightOJ 1030 Discovering Gold(期望)
Description You are in a cave, a long cave! The cave can be represented by a 1 x N grid. Each cell o ...
- 转:通过ant来批量执行jmeter脚本,并生成报告(附: 生成报告时报“Content is not allowed in prolog”这个错误的解决方案)
最近在使用jmeter写脚本来进行测试,最终写了很多份脚本,然后,就在想,这么多脚本,我不可能一个一个的手动去点啊,有没有什么办法来批量运行Jmeter脚本呢? 这个时候,自然而然地想到了万能的ant ...
- linux的mount(挂载)NFS 共享,命令详解
Linux下挂载(mount)光盘镜像文件.移动硬盘.U盘.Windows和NFS网络共享 linux是一个优秀的开放源码的操作系统,可以运行在大到巨型小到掌上型各类计算机系统上,随着 linux系统 ...
- java邮件收发
http://blog.csdn.net/ycg01/article/details/1394465 java邮件收发 标签: javaimportexceptionnulluserclass 200 ...
- angularjs三级联动
<div ng-controller="AjaxCtrl"> <h1>AJAX - Oriented</h1> <div> Coun ...
- Android编译,模块的编译和CLEAN
在Android源代码目录下的build目录下,有个脚本文件envsetup.sh: $ . build/envsetup.sh 注:该命令的前面的逗点(.),相当于source. 执行这个脚本文件后 ...
- 转:移植SlidingMenu Android library,和安装example出现的问题解决
很多项目都用到类似左侧滑动菜单的效果,比如facebook,evernote,VLC for android等等,这很酷 源代码可以从GitHub的https://github.com/jfeinst ...
- 关于UIView及其子类重绘drawRect
转载自:https://nezha.gitbooks.io/ios-developmentarticles/content/UIView%E7%9A%84drawRect%E9%87%8D%E7%BB ...
- Swift 开发中Alamofire的使用
Swift 开发中Alamofire的使用 Alamofire需要解决的6个问题 1.Json解析 2.下载和上传 4.全局401错误 5.网络图片