写点什么

使用 MetaLinq 编辑表达式树

2007 年 6 月 15 日

表达式树在任何语言中都是一个强大的功能。LINQ 使用他们来执行对象查询,如 DLINQtoSQL 就是把对象查询转换为 SQL 查询。其他人使用他们来动态生成代码。但正如任何其他功能,总是存在设计缺陷。

为了更好的支持类似查询推理和函数结构的功能,表达式树被设计为不可变的。函数库被保证,一旦这些函数库引用了一个表达式树后,表达式树就不再改变。通过这样的设定,所有错误类型都会被消除,然而这使要编辑表达式树变得有点困难。

开发人员如果想编辑表达式树,那么不得不通过拷贝现有的一个(表达式树)来手动的创建一个新的。Aaron Erickson 的 MetaLinq,通过提供把表达式树转换为可变形式并可转换回来这样的一个方法,从而允许开发人员避开这个限制。

MetaLinq 实现了被 Aaron 称为“可编辑影子”的功能。开发人员通过把表达式树作为参数传入 CreateEditableExpression 方法来创建这样的一个影子。在完成更改后,他们只需简单地调用 ToExpression 方法再次得到一个可用的表达式树即可。

MetaLinq 并不是唯一对表达式树进行编辑的方法。 Jomo Fisher 演示了一个使用访问者模式代码,这段代码通过创建一个新树来替换特定的节点,而不是浏览整个表达式树。当然,这种技术从概念上来说是比较复杂,它能支持一些更有意思的搜索和替换功能。

查看英文原文: Edit Expression Trees with MetaLinq - - - - - -

译者简介:朱永光,IT 自由人和环境保护者,微软最有价值专家(MVP)和 MCSD。他有 14 年的编程实践经历,5 年软件构架和开发管理经验,擅长微软相关技术和产品,目前主要关注软件构架和开发框架,是成都.NET 俱乐部副主席和核心讲师,个人博客为 http://redmoon.cnblogs.com 。现在他作为共同创始人经营着一家环境保护技术公司。参与InfoQ 中文站内容建设,请邮件至 china-editorial@infoq.com

2007 年 6 月 15 日 03:40302
用户头像

发布了 254 篇内容, 共 38.2 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

第八周总结

孤星

Codurance不太一样

sherlockq

别再用智能合约时代的思维,去思考下一代区块链应用

CECBC区块链专委会

区块链 计算机

前端不得不懂的架构知识(中)

执鸢者

架构 前端

架构师训练营第八周作业1

韩儿

Prometheus backfilling 功速体验

_why先生

Prometheus tsdb

性能优化练习

Mars

第十二周作业(作业二)

Geek_83908e

架构师一期

第十二周 数据应用1 总结

三板斧

极客大学架构师训练营

大数据1第十二周作业「架构师训练营第 1 期」

天天向善

架构师训练营 1 期 - 第十二周 - 数据应用1

三板斧

极客大学架构师训练营

第八周作业

孤星

第八周 作业

Jack

Prometheus TSDB(Part 1):头块

_why先生

Prometheus tsdb

架构师训练营第八周作业2

韩儿

性能优化总结二

Mars

架构师训练营第 1 期 - 第 12 周课后练习

Anyou Liu

极客大学架构师训练营

第十二周作业

alpha

极客大学架构师训练营

第三周 代码重构 作业 「架构师训练营 3 期」

feiyun123

极客大学架构师训练营

生产环境全链路压测建设历程之七: 淘宝网2012年双十一库存超卖问题的本质

数列科技杨德华

第十二周作业(作业一)

Geek_83908e

架构师一期

架构师训练营 2 期 - 第八周总结

Geek_no_one

极客大学架构师训练营

银行业大数据应用及HiveQLjoin分析

garlic

极客大学架构师训练营

宝马区块链负责人:我们是如何让区块链技术与汽车产业结合的?

CECBC区块链专委会

大数据

12周作业

橘子皮嚼着不脆

许可区块链是许多金融应用未来的关键特性

CECBC区块链专委会

比特币区块链

02-week3-homework

J

极客大学架构师训练营

架构师训练营第十二周课后作业

Gosling

极客大学架构师训练营

第三周作业

Geek_b9053c

《社会中的数据可视化》PDF免费下载

计算机与AI

数据可视化

架构师训练营第 1 期 week12

张建亮

极客大学架构师训练营

微服务架构下如何保证事务的一致性

微服务架构下如何保证事务的一致性

使用MetaLinq编辑表达式树-InfoQ