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

  • ASP.NET学习路线图

    2011-8-8 19:14:00

    如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET。 AS

  • MbUnit 2.4 RTM

    2007-5-25 4:17:00

    After over 6 months of hard work the MbUnit 2.4 went to RTM tonight . Between the RC and the RTM.

  • 关于.NET内存中的堆和栈

    2011-7-20 22:27:00

    今天中午李建忠发了一条关于class性能好还是struct性能好(换言之、堆性能好?还是栈性能好?)的话题 微博 ,引发包括老赵这些牛人级的开发人员的热烈讨论。作为.NET开发背景的人,一般都会

  • 也谈约定胜于配置

    2007-4-15 10:06:00

    它是Rails技术的核心原则,逐渐也成为了敏捷开发技术的一个重要思想。最早看到它是在一个朋友的MSN上将它作为个性化信息,想对它有更深入的了解是在自己越来越多的开发实践中遇到的各种各样的配置麻烦时,

  • 【自然框架】 权限 的视频演示(二): 权限到字段、权限到记录

    2009-9-7 15:50:00

    摘要: 继续。这里演示权限到字段和权限到记录。权限到字段有两种安全级别,1、低安全级别。有些项目不需要做到控制每一个字段是否显示,那么就可以采用这种级别。低安全级别就是:如果一个节点里面没有设置可以

  • 发布一个无聊之作,起点小说更新监视器

    2009-10-6 14:32:00

    摘要: 这个是无聊的时候写着玩的,高手们、大虾们就不要嘲笑了。程序没什么技术含量,纯粹就是JavaScript的简单应用,写成了一个Windows边栏程序。功能不多,就两点1、间隔时间查看指定的起点

  • ASP.NET MVC 2: Strongly Typed Html Helpers

    2010-1-11 13:55:00

    [In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow

  • [叩响C#之门]第4章 流程控制 4.7 循环语句深化练习:分形图

    2010-1-13 15:48:00

    阅读: 189 评论: 1 作者: 寒飞雨 发表于 2010-01-13 13:30 原文链接 2004年刚学C#的时候萌生了写一本书的念头,边学边写,中间经历了无数次的修改,到今年出版时

  • asp.net mvc源码分析-Action篇 IModelBinder

    2012-11-10 9:34:00

    紧接着上篇 asp.net mvc源码分析-Action篇 ParameterDescriptor 文章 在ReflectedParameterBindingInfo有这个 public overr

  • 发布DotNetNuke C#版本

    2010-2-8 17:11:00

    阅读: 1053 评论: 21 作者: ZyhFish 发表于 2010-02-08 12:34 原文链接 年关将至,终于基本完成了DotNetNuke的C#版本,基于最新的5.2.2版本