.Net4 Expression Tree 入门(1): Hello World!

某程序员退休后决定练习书法,
于是重金购买文房四宝。
一日,饭后突生雅兴,一番研墨拟纸,并点上上好檀香。
定神片刻,泼墨挥毫,
郑重地写下一行字:Hello World!

 

回忆大学学习.Net时,写下的第一行代码是:

Console.WriteLine("Hello World!");

 

同样,作为.Net4 Expression Tree 入门示例,我认为经典的“Hello World“ 应该是最合适不过了。

本篇为了更好地演示.Net4 Expression Tree 的新功能,特意把 Hello World 的代码稍微修改一下:

string s;
s = "Hello World!";
Console.WriteLine(s);

 

然后用表达式逐一实现以上3条语句。

1. string s;
var s = Expression.Variable(typeof(string), "s");

Expression.Variable:声明一个变量。第一个参数指定类型,第二个参数指定名字(可选)。

2. s = “Hello World”;
var assignExpression = Expression.Assign(s, Expression.Constant("Hello World!"));

Expression.Assign:对s赋值

3. Console.WriteLine(s);
var callExpression = Expression.Call(null,
    typeof(Console).GetMethod("WriteLine", new[] { typeof(object) }), // Console.WriteLine(s);
    s
);

Expression.Call:调用Console.WriteLine方法

 

最后,需要 Expression.Block 把以上三个表达式组织起来:

Expression.Block(
                new[] { s },
                assignExpression,
                callExpression)

以下是 Expression.Block 的其中一个函数签名:

public static BlockExpression Block(IEnumerable<ParameterExpression> variables, params Expression[] expressions);

第一个参数是指定变量(如示例的s),第二个参数是具体实现的表达式(如赋值、循环等等)。

完整的代码:

var s = Expression.Variable(typeof(string),"s");//string s;

var assignExpression = Expression.Assign(s, Expression.Constant("Hello World!"));//s = "Hello World!"

var callExpression = Expression.Call(null,
    typeof(Console).GetMethod("WriteLine", new[] { typeof(object) }), // Console.WriteLine(s);
    s
);

var writelineExpression = Expression.Lambda<Action>(Expression.Block(
    new[] { s },
    assignExpression,
    callExpression)
);

var writeline = writelineExpression.Compile();

writeline();

 

总结

Hello,Expression Tree!


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

posted on 2010-05-17 00:07  CoolCode  阅读(2808)  评论(8编辑  收藏  举报