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 永远不会孤军作战的, 正如一根支柱不会独立存在那样。

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