当前位置 > 首页 > Asp.net

LambdaParser:解析字符串为Lambda表达式并编译为委托

2009-6-10 20:39:00来源:Asp.net

最近刚刚离了职,便休息一会做点自己想做的事,于是花点时间写了这个解析字符串为Lambda表达式并编译为委托的模块:LambdaParser。

介绍

先举个最简单的例子让大家明白LambdaParser模块究竟做什么:

[代码]

简单的说,LambdaParser模块就是在运行时编译Lambda表达式

原理

LambdaParser的最主要方法ParseDelegate接受一个代码字符串,返回一个委托。
LambdaParser会分析输入的代码字符串,然后一个一个构造Lambda Expression,最后编译成委托。
这样,我们就能动态编译并执行代码
若是每次都这样,性能当然好不到哪里去,于是我在ExpressionParserManager做缓存,在下次调用时从缓存里取委托。

特点

在运行时编译Lambda表达式不是一个常规解决方案,但有时候很有用,它比反射更灵活,更快,更易懂。

一些说明

1.基于Lambda表达式,所以当然也不支持Lambda表达式不支持的,如:赋值操作等。

2.只支持Lambda表达式,不支持Lambda语句。也就是说不能写多条Lambda语句,所以if,for,while等肯定是不支持的。

3.理所当然,支持数字运算,支持字符串拼接。目前尚未做编译优化,比如:1+2这种常量运算本来是可以在编译的时候就计算出来,但现在是原原本本的编译出来,在运行时去计算。字符串的拼接也一样。

4.目前尚不支持checked运算。

5.由于我是看了老赵的《这下没理由嫌Eval的性能差了吧?》才有这想法的,对于那一段Expression代码(DynamicPropertyAccessor构造函数),当时花了N+M次的来回阅读,才勉强弄明白意思,于是计划写这个,所以我用老赵的思路也实现了一个FastEval,由于我这个类库本来就是做解析的,所以对于FastEval的参数也就原生的支持表达式语句,而不仅仅是属性名,所以我认为我这个FastEval实现比原本的Eval更快,更灵活:)
example:<%#FastEval("Sex?\"男\":\"女\"")%>

6.本打算同样用老赵的思想实现FastReflectionLib,但发现LambdaParser还有很多事要做,就先搁置。

7.如果本身的Lambda表达式写得有问题,那么报的错误可能会很奇怪,因为时间原因目前没有很友好的错误提示。

结束语

项目中必定会有不少bug,若是解析某个特定code时出意外,希望将输出的code发给我,可以在这里回复,或者发到我邮箱:zhucai+lambdaparser@gmail.com
今天只是简单介绍一下其功能及使用方法,之后有时间我再来详细谈谈设计过程。
我在sourceforge.net申请了个项目:https://sourceforge.net/projects/lambdaparser
但现在还不会玩:(
先从这儿下载吧,源码(附测试用例): http://files.cnblogs.com/zhucai/LambdaParser.7z
仅dll: http://files.cnblogs.com/zhucai/Zhucai.LambdaParser.dll.7z

贴上所有已通过的测试用例,方便弄明白用法:

[代码]

 



-----------------------------------------------------------------------------------------------------------------------
本文链接: http://www.cnblogs.com/zhucai/archive/2009/06/10/LambdaParser_Lambda_Expression_Parser.html
作者博客: http://www.cnblogs.com/zhucai/ [订阅]
网站导航: 博客园首页  新闻  .NET频道  社区  博问  闪存  找找看
新闻频道: 盖茨接班人称Google Wave反互联网 应依赖开源软件

  • 遗传编程算法

    2009-11-7 23:14:00

    阅读: 124 评论: 0 作者: zgw21cn 发表于 2009-11-07 21:50 原文链接 假设从向银行申请贷款的顾户中,要选出优质顾客。怎么做? 现在有学习数据如下

  • F# 基本语法—类型

    2009-10-21 14:43:00

    原文出处: http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!1077.entry Translated by Mik

  • How to upgrade Atom 0.3 feeds on the fly with a custom XmlReader for use with WCF Syndication APIs

    2009-2-6 21:53:00

    Even now that Atom 1.0 has been approved and official for some time, theres a feed every now and th

  • 超级简单的代码生成器

    2009-12-18 17:32:00

    阅读: 428 评论: 2 作者: 麒麟 发表于 2009-12-18 14:53 原文链接 代码: /Files/zhuqil/SqlClassFactory_src.zip

  • MSIL: Part 4

    2007-9-8 4:08:00

    In this part we will look at the differences between what the C++/CLI compiler generates and that t

  • 2010年的计划

    2010-1-2 7:14:00

    在自己的blog上发布计划的好处之一,就是可以督促自己。如果当2010年年底的时候,这些计划没完成,就请大家尽情的BS我吧。 1、搞清楚 SharePoint 2010 。这包括Si

  • 利用XSL将DataSet数据转换为Excel文档

    2007-3-26 17:42:00

    摘要: 本文从实际出发描述了如何利用XSL将DataSet中的数据转化为带有格式的Excel文档 阅读全文 零度的火 2007-03-26 16:50 发表评论

  • .Net Web Sesssion使用不再受限

    2012-11-16 18:51:00

    可能需要做仅一次登录(别人登录过,你不能登录或强制T前一个人的登录),也有可能在想在不能使用Session的地方,比如缓存自定权限认证需要使用Session。 首先,第一思维,不应该是自定义,不管

  • 闲话领域驱动设计

    2009-11-17 20:40:00

    阅读: 174 评论: 0 作者: pillow 发表于 2009-11-17 18:55 原文链接   Eric Evans的《领域驱动设计——软件核心复杂性应

  • Dealing with Silverlight and SSL and without SSL

    2009-6-4 14:33:00

    Silverlight can without any problem talk to HTTP or HTTPS. So if you do not know where will be