文章分类 - .Net4 Expression Tree 入门
.Net4 Expression Tree 入门
摘要:表达式树(Expression Tree)是.NET 3.5中引入的一种表达方式。表达式树的运用十分广泛,可以直观地表现出各种“数据”,甚至“逻辑”和“行为”。再者,表达式树是强类型的,因此合理地使用这个新特性可以让代码编写变得优雅,方便。一个最简单而常见的例子便是,某些朋友目前就已经喜欢使用表达式树来代替传统的ByXxx方法,尤其是在访问一些直接支持表达式树的数据源时(例如IEnumerable或LINQ to SQL)。如下:public User GetUser(Expression> predicate) { }而不必写成:public User GetUserByID(int
阅读全文
摘要:上回我们说到手工解析Expression Tree,以便获得其中的逻辑或者执行我们自定义的语义动作。这种做法扩展了C#语言的威力,让我们可以用C#的语法来做更多的事情,例如Linq to Sql。今天我们要学习一种相反的做法,手工创建表达式树,然后让.NET来解析它。这是一种强大的动态编程手段。我们可以用它来完成许多以前需要Reflection.Emit才能完成的任务。LambdaExpression的独有方法:Compile这里我们仍要使用诸多表达式中与众不同的LambdaExpression。在Visual Studio中我们可以看到他有一个Compile方法。这是做什么的呢。在第一篇中我
阅读全文
摘要:上回我们说到Expression Tree是一种表示编程语言中“表达式”概念的树状数据结构,并且学习了从Lambda表达式自动生成表达式树的C#语法。那么它到底有什么用呢?其实上一回已经提到了Expression Tree的基本功能:分析表达式的逻辑、保存和传输表达式以及重新编译表达式。现在我们就分别来看这三项基本功能如何使用。分析表达式的逻辑表达式树中已经包含了表达式所需的各种成分,我们只需要像遍历树一样遍历表达式树,就可以解析表达式的含义。我们现在就来动手解析一下四则运算的表达式树。假设表达式中仅有加减乘除运算。比方说我们有这个一个表达式(a, b, m, n) => m * a *
阅读全文
摘要:大家可能都知道Expression Tree是.NET 3.5引入的新增功能。不少朋友们已经听说过这一特性,但还没来得及了解。看看博客园里的老赵等诸多牛人,将Expression Tree玩得眼花缭乱,是否常常觉得有点落伍了呢?其实Expression Tree是一个一点就透的特性,只要对其基本概念有了一定的了解,就可以自己发挥出无数的用法。特别是之前对Reflection,泛型等知识有过一些了解的话,就会发现Expression Tree的加入绝对是你工作中的得力助手。如果你是Expression Tree的新手,那么从本文开始,你就可以领略这一工具,之后再看老赵的文章就从容不迫了~从表达式
阅读全文
摘要:LINQ Expression tree能直接表示的语法结构在上一篇中已经详细的列了出来,包括算术、按位、逻辑等运算符的表达式、条件表达式、方法调用表达式、对象创建表达式等。要表示一般的命令式程序,需要支持3中基本控制流语法结构:顺序、分支、循环。在C#中这三种结构能很自然的用语句来表示,但有语句的lambda表达式无法用LINQ Expression tree表示。下面就让我们来看看这三种结构如何转换成只用表达式的方式来表示。需要事先说明三点:1、只要避免使用赋值相关的表达式,一个只包含表达式的lambda表达式既可以转换为委托也可以转换为Expression tree;手工创建Expres
阅读全文
摘要:系列的前三篇介绍过LINQ与DLR中的expression tree的概况后,我们对LINQ与DLR所使用的AST的概况和关系应该有一定认识了。既然LINQ Expression tree现在是DLR tree的子集,而DLR能够使用DLR tree来支持动态类型的语言,那么LINQ Expression tree能不能同样支持动态类型方式的呢?系列接下来的文章就会围绕这个主题,描绘一个从使用LINQ Expression tree过渡到使用DLR tree的过程。本篇,我们先来详细看看要自己手工创建一棵LINQ Expression tree大概是个什么样子。System.Linq.Expr
阅读全文
摘要:(为节约带宽和版面,文中缩小图片请点击放大)语言特定的AST与DLR tree在介绍DLR tree之前,先看看它的原点,IronPython 1.x中的AST(抽象语法树)类层次。使用先前写的类型层次查看工具,截得此图:以上的类层次除System.Object外都位于IronPython.Compiler.Ast命名空间中。IronPython 1.0系列与1.1系列中的AST类层次是一样的。注意到表达式(Expression)与语句(Statement)的节点都是继承自Node,也就是说IronPython 1.x是区分表达式与语句的。在许多语言中,表达式与语句最大的区别就是是否有值:表达
阅读全文
摘要:上一篇简单介绍了一下LINQ中的Expression tree是什么,接下来将简单介绍一下另一个主角——DLR的状况。先讲讲故事吧 ^ ^DLR的前身——IronPython 1.xIronPython是由Jim Hugunin在微软领导开发的一个.NET平台上的Python实现,包括了完整的编译器、执行引擎与运行时支持,能够与.NET已有的库无缝整合到一起。Python由Guido van Rossum于1990年开始开发,是一种相当成熟的编程语言,简洁、动态、强大。它的标准实现也叫做CPython,是用C语言编写的。Jim Hugunin在写硕士论文时使用Python来实现了部分功能。19
阅读全文
摘要:以前在这边也发过关于LINQ的帖,不过并没有涉及比较深入的部分。之前的这篇:使用lambda expression来动态获取delegate,然后用Cecil注入代码(1)并不是没有下文了,而是在短短的时间内情况发生了许多变化,使得一些原本的想法有机会以更简单的方式来完成。接下来的一段时间我会发一些与LINQ、DLR等相关的帖,探讨它们与动态代码生成、动态类型代码等的关系,也将会继续讨论通过它们来进行依赖注入的话题。关于这个“树”的叫法……LINQ里的表达式树有官方文档就叫Expression tree,但DLR中相应的语法树却没有什么固定的正式叫法,有时候叫做DLR AST,有时候叫DLR
阅读全文
摘要:大概两年前我写了篇《QueryBuilder : 打造优雅的Linq To SQL动态查询》,赢得不少厚爱,如今它还是我博客访问量最高的一篇(即使只有可怜的5500点击量,比一些大牛们少一位数)。时过境迁、岁月不饶人,当年得意之作现在看起来不值一文。收集一下朋友的反馈,主要有下列问题:不支持 Entity Framework不支持.Net 4Equals(c=>c.xx, null) 之前是被忽略掉,实际上应该解析成 c.xx is null。Between 没有考虑字符串的情况,例如 Between(c=>c.xx, ”A” , ”Z”) 则解析会报错。部分不支持Nullable
阅读全文
摘要:首先我们来看看日常比较典型的一种查询Form这个场景很简单:就是根据客户名、订单日期、负责人来作筛选条件,然后找出符合要求的订单。在那遥远的时代,可能避免不了要写这样的简单接口:public interface IOrderService{ IList Search(string customer, DateTime dateFrom, DateTime dateTo, int employeeID);}具体爱怎么实现就怎么实现啦,存储过程,ORM框架。这里假定是用了孩童时代就开始有的存储过程吧:Create Procedure usp_SearchOrder @Customer ...
阅读全文
摘要:前言著名的牛顿同学曾经说过:如果说我比别人看得更远些,那是因为我站在了巨人的肩上.原文:If I have been able to see further, it was only because I stood on the shoulders of giants.What's Lambda表达式?请参考msdn:Lambda 表达式(C# 编程指南)Lambda表达式编写递归函数? How?建议没有看过老赵的《使用Lambda表达式编写递归函数》这篇文章的朋友,请先前往围观,你会受益匪浅。原文实现如下的递归效果:var fac = Fix(f => x => x (f
阅读全文
摘要:前面已经介绍了.Net4 Expression Tree的分支与循环,是时候综合起来写一个稍微复杂一点的实例了。求N以内的所有质数一般的写法static List GetPrimes_SimpleMethod(int to){ var res = new List(); for (int n = 2; n GetPrimes_NoFor(int to){ var res = new List(); int n = 2; while (true) { if (!(n ();Expression.Assign( res, Expres...
阅读全文
摘要:前言刚开始学习编程时,我认为程序带来的价值远不如我为它写的代码多,因为它顶多算加减乘除比一般人快而已,直到我认识了“循环”。而一天后,我又发现程序可以“死循环”,而当时我应付“死循环”的方法是——关机 (- . -!) 狂汗啊!Loop 循环这篇文章介绍 Expression Tree 的循环语句:For,Do,While。咳咳,应该是Loop!没错,Expreession Tree里没有For,Do,While这些熟悉的朋友,叫了他们的祖先Loop来应付。正如鲁迅那句经典的语录——世界上本没有For,Do,While,程序员写代码写多了烦了,也便有了。实际上,Loop和Do差不多,它等价于d
阅读全文
摘要:上一篇的 Hello World简单介绍了.Net4 Expression Tree 的用法,这一篇主要介绍以下表达式——public static ConditionalExpression IfThen(Expression test, Expression ifTrue);public static ConditionalExpression IfThenElse(Expression test, Expression ifTrue, Expression ifFalse);public static SwitchExpression Switch(Expression switchVa
阅读全文
摘要:某程序员退休后决定练习书法,于是重金购买文房四宝。一日,饭后突生雅兴,一番研墨拟纸,并点上上好檀香。定神片刻,泼墨挥毫,郑重地写下一行字:Hello World!回忆大学学习.Net时,写下的第一行代码是:Console.WriteLine("Hello World!");同样,作为.Net4 Expression Tree 入门示例,我认为经典的“Hello World“ 应该是最合适不过了。本篇为了更好地演示.Net4 Expression Tree 的新功能,特意把 Hello World 的代码稍微修改一下:string s;s = "Hello Worl
阅读全文

浙公网安备 33010602011771号