随笔-48  评论-693  文章-1  trackbacks-0

Expression Tree 值不值得我去学?

 

为什么我需要 Expression Tree?

它有什么好处?

实际项目中有可能用到它么?

它可以应用在哪些地方?

… …

以上是很多不认识Expression Tree,或刚接触不久的童鞋们所困惑的问题。实际上,上面这些问题在他们心中只是归纳成一个问题——Expression Tree 值不值得我去学?

 

于是乎,大多数技术诞生时都会伴随着Showcase,Getting Started,Tutorial,Sample Application等。大学某些导师就是没有得这一窍门,在开课的第一天没有花时间去展示他所教导的课程的Showcase,以至于童鞋们感到very boring,没有动力学下去。关于这一点,当初教导我编程语言的老师经过一段时间后明白了。她在开课前一个月都是讲语法,什么if else for while 啊,发现童鞋们睡倒一大片。于是,她用她所教导的语言编写了几个图形游戏,如打乒乓球之类的。那一堂课,童鞋们专心多了,而我也知道编程不只用于加减乘除了。

Showcase For Expression Tree

严格来说,Expression Tree 是个低调的家伙,以至于它的光芒被其他上层建筑挡住了,如Linq to SQL。因此,也很难找到能让大家眼前一亮的Showcase,而只能限于代码级别去展示。

Case 1: Linq to SQL 动态查询
var queryBuilder = QueryBuilder.Create<Order>()
    .Like(c => c.Customer.ContactName, txtCustomer.Text)
    .Between(c => c.OrderDate, DateTime.Parse(txtDateFrom.Text), DateTime.Parse(txtDateTo.Text))
    .Equals(c => c.EmployeeID, int.Parse(ddlEmployee.SelectedValue))
    .In(c => c.ShipCountry, selectedCountries); 

详见 QueryBuilder : 打造优雅的Linq To SQL动态查询

更多 Google 一下 Linq to SQL 动态查询

Case 2:打造 Linq Provider

Linq to Google 示例代码

GoogleContext gc = new GoogleContext(key);
var r = from ipods in gc.products
        where ipods.BaseQuery == "mp3 players" && ipods.Brand == "apple" && ipods.FeedType == "snippets" && ipods.Price < 200
        orderby ipods.Price
        select new { ipods.Title, ipods.Price };

更多 Walkthrough: Creating an IQueryable LINQ Provider

Google 一下 Linq Provider

Case 3:动态代码、动态编译、动态组件
var c = new CodeDomGenerator();

c.AddNamespace("Samples").AddClass("TestClass")
   .AddMethod(MemberAttributes.Public | MemberAttributes.Static, () => "Print",
       Emit.stmt(() => Console.WriteLine("Hello, world!"))
);

Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.CSharp));
Console.WriteLine(c.GenerateCode(CodeDomGenerator.Language.VB));

Assembly assembly = c.Compile();

详看Expressions to CodeDOM

 

以上示例代码都见不到 Expression Tree 的影子,因为 Expression Tree 是支撑物,默默地成为伟大建筑的一根支柱。

以上示例代码并不是说非用 Expression Tree 不可,底层实现方法有很多,Expression Tree 只是其中一种。

结论

Expression Tree 永远不会孤军作战的, 正如一根支柱不会独立存在那样。


作者:Bruce编程的艺术世界
出处:http://coolcode.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted on 2010-05-26 12:14 CoolCode 阅读(2504) 评论(17) 编辑 收藏

评论:
#1楼 2010-05-26 12:44 | dongzzw      
如果你想缓存一个Expression的话(这很常见),你就得了解Expression Tree了
 回复 引用 查看   
#2楼 2010-05-26 14:27 | xiaotie      
我是不想学的。
 回复 引用 查看   
#3楼 2010-05-26 14:40 | 韦恩卑鄙 v-zhewg @waynebaby      
引用dongzzw:如果你想缓存一个Expression的话(这很常见),你就得了解Expression Tree了

只需要用现成的序列化器 不一定要懂

 回复 引用 查看   
#4楼 2010-05-26 17:40 | Terry Sun      
值得,还是很有用的
 回复 引用 查看   
#5楼 2010-05-26 17:42 | 陈梓瀚(vczh)      
要觉得学新东西很爽
 回复 引用 查看   
#6楼[楼主] 2010-05-26 18:22 | CoolCode      
@陈梓瀚(vczh)
@Terry Sun
呵呵,看来Expression Tree还是有人关注的。

 回复 引用 查看   
#7楼 2010-05-26 18:57 | Ivony...      
缓存一个Expression只需要Delegate就够了。
 回复 引用 查看   
#8楼 2010-05-26 20:49 | Kevin Yang      
顿时让我失去了兴趣。。。。
 回复 引用 查看   
#9楼 2010-05-26 21:21 | Justin      
多少让我感觉有那么点 标题党
 回复 引用 查看   
#10楼[楼主] 2010-05-27 21:46 | CoolCode      
@Kevin Yang

 回复 引用 查看   
#11楼[楼主] 2010-05-27 21:47 | CoolCode      
@Justin
呃。。。其实是回答上一次某些童鞋们的疑问

 回复 引用 查看   
#12楼[楼主] 2010-05-27 21:50 | CoolCode      
@Justin
标题是起的有点煽情,这里自我检讨一下。。。

 回复 引用 查看   
#13楼 2010-05-27 21:59 | Kevin Yang      
@CoolCode
就像你说的,expre tree没有什么让人眼前一亮的showcase。对我来说,感觉没什么兴趣

 回复 引用 查看   
#14楼[楼主] 2010-05-27 22:12 | CoolCode      
@Kevin Yang
嗯,确实很多人都这样感觉
毕竟Expression Tree只是占.Net很少的一部分

 回复 引用 查看   
#15楼 2010-05-27 22:24 | Kevin Yang      
@CoolCode
你工作是做什么方面的?经常会用到expression tree吗?之前其实已经在博客园上看到类似的文章,但感觉和自己做的应用比较遥远,就没有关注。想请教下,你觉得什么应用比较适合用到expr

 回复 引用 查看   
#16楼[楼主] 2010-05-28 21:58 | CoolCode      
@Kevin Yang
嗯,现在用到的基本上就是Case1和2
Linq to SQL 动态查询打造 Linq Provider

 回复 引用 查看   
#17楼 2011-07-13 17:14 | 笨笨蜗牛      
请教:
我想对任意的一个实体对象,以及以字符串形式标识的属性或变量名,获取该属性的内容 这个行为写成一个函数,该如何操作?

即:
object Eval(object/instance instance, string propertyName)
{
return instance[propertyName];
}

类似上面的,当propertyName为A时,返回 instance.A,当为B时返回 instance.B。

 回复 引用 查看   
coolcode

网名:CoolCode,洋名:Bruce Lee,现就职于广州品高担任技术经理一职。以移动为行业方向,主要参与协同办公、工作流、知识库、门户等项目。工作之余一直有个小小愿望——重拾多年尘封的画笔到户外作画,但愿N年前的油画颜料还能用。吐舌笑脸


联系方式:
昵称:CoolCode
园龄:3年1个月
粉丝:74
关注:40

搜索

 

常用链接

我的标签

随笔分类(47)

随笔档案(48)

积分与排名

  • 积分 - 118115
  • 排名 - 849

最新评论

阅读排行榜

评论排行榜

推荐排行榜