当前位置 > 首页 > 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反互联网 应依赖开源软件

  • .net framework总是出现错误提示

    2010-9-23 7:41:00

    我的机器是w500 装的是win7x64中文旗舰版 补丁都及时更新 装了.net 4 之前还装了visual studio c++ 2008 express版 后来打了一个补丁

  • Asp.Net】教你一步一步学习Ajax(二)使用POST方法

    2011-10-25 16:00:00

    上一篇学习了如何在Ajax中使用GET方法来进行直的传递,下面我们来学习另一种传值方法:POST。 关于GET和POST两种方法的区别有一下几种: 1.使用GET方法安全性很低,传递的值是通

  • ASP.NET MVC 3: Intranet Application template

    2011-4-14 7:55:00

    ASP.NET MVC 3 Tools Update introduced new project template called Intranet Application. The main d

  • 使用Devexpress組件打印时标题的处理

    2007-3-24 12:57:00

    摘要: 如何在处理DevExpress的所有可打印部件如(gridControl,TreeList...)这些控件在打印时能加上标题。 阅读全文 fosoyo 2007-03-24 11

  • 关于模板控件如何实现多数据源绑定的问题

    2007-3-12 15:14:00

    摘要: 在读Clinglingboy的asp.net控件开发基础(18)时,Clinglingboy对其进行了重点讲解。可是我感觉在如何将具有IListSource接口的数据源最终转化为DataVi

  • 从一个小实例开始 - Boo开篇

    2009-4-14 14:59:00

    摘要: 前一阵小组内部培训时,提到下面这个例子:“假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候: 1、警报器会开始发出语音,告诉你水的温度; 2、显示器也会改变水温的

  • IP to Integer

    2010-2-2 7:22:00

    有时候我们要判断某个IP是否在某个段内,如何实现呢? 一个简单办法就是把IP转换成Integer,然后判断整数是否在某个范围内就可以实现这个判断。 转换的算法如下: 比如我们要转换的IP

  • 基于web信息管理系统的权限设计分析和总结

    2009-5-21 12:37:00

    摘要: 在大部分的系统中都是用的基于角色控制模型的权限管理。在这样的系统中,创建一系列的角色,然后把基本权限单位分配给这些角色,再把角色分配给用户,这样用户登录系统后,就根据当前用户所拥有的角色可以

  • Design Pattern 设计模式【观察者】

    2009-11-26 17:32:00

    阅读: 255 评论: 0 作者: virus 发表于 2009-11-26 09:33 原文链接   观察者设计模式中存在两种角色: 观察者 和 被观察者 。   最经典的例