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