貌似离我上一次发表博文已有半年之久,期间本人经历了毕业答辩,毕业后跳槽重新回到惠普全球交付中心武汉分公司FOT项目组,跳槽后由于账号问题延迟了3个月才拿到工资等一系列曲折的问题与事件,期间实在是无暇,更无心情更新博客,希望大家理解。
再次提笔,我甚至都不知该如何写这个系列,这一篇先找找感觉,大家将就着看,希望对大家能有所帮助。
OK,现在进入正题,先向大家介绍一个工具ExpressionTreeVisualizer,有了这个dll,我们在debug的时候就可以用可视化的方式来查看表达式树的结构。
由于本人实在不知道如何在文章中插入dll文件,所以暂时附上ExpressionTreeVisualizer这个名字,大家可以去搜索这个project,应该很容易下载。 如果大家知道如何在文章中插入dll,也可留言告诉我,另外如有问题,也可email与我联系:zxhlelva@126.com.
有了这个dll之后,我们就按照http://msdn.microsoft.com/zh-cn/vstudio/bb882632(VS.90).aspx这篇文章所说的方式 把DLL放到指定的位置,我是vista的系统,所以就放到了 Documents\Visual Studio 2008\Visualizers 这个位置,用xp系统的朋友可以放到My Documents\Visual Studio 2008\Visualizers 这个位置。
紧接着我用一段样例代码来查看这个工具的的作用:
aircraftTestString.AirlineId = "Test";
ParameterExpression aircraftParameter = Expression.Parameter(typeof(Aircraft), "aircraftTestString");
MemberExpression memberAirlineIdExpression = Expression.Property(aircraftParameter, "AirlineId");
ConstantExpression nullConstant = Expression.Constant(null);
ConstantExpression emptyConstant = Expression.Constant(string.Empty);
Expression<Func<Aircraft, bool>> equalNull = Expression.Lambda<Func<Aircraft, bool>>
(Expression.Equal(memberAirlineIdExpression, nullConstant),
new ParameterExpression[] { aircraftParameter }
);
我们在Expression<Func<Aircraft, bool>> equalNull = Expression.Lambda<Func<Aircraft, bool>> 这一行打上一个断点,Debug时如图所示:
大家可以看到,这个时候会出现一个放大镜图标,点一下那个放大镜,就可以看到如下图所示的表达式树结构
我们可以看到,一个表达式由2部分组成,body和parameter,顾名思义,body部分就是表达式树的逻辑,parameter就是表达式树的参数。具体到这个表达式树,我们可以看到,在body部分层次如下
BinaryExpression(二叉表达式 这里是表示相等的关系)
Left Right
MemberExpression(表示访问parameter某个属性的值) 常量表达式
Parameter部分就比较简单, 只有一个ParameterExpression , 表示指定这个表达式树的Parameter.
到这里我们初窥了表达式树的结构。这一篇只是作为一个我给自己找感觉的引子。最后我想提出一个问题, 大家从之前一系列的博文中可以看出,构建表达式树不是一个很简单的事情,那么,在逻辑相似的情况下,我们是否可以访问并抽取出一个已有表达式树的结构并用这个结构来构建出一个新的表达式树呢?
答案显然是肯定的,那么,我们该如何做到这一点呢,在这个工作中我们又会遇到哪些问题呢?在下一篇中我会详细阐述这个问题。希望大家到时能捧场,我在此承诺,一星期内我必会更新出这篇博文,敬请期待。