Expression Tree Introduction - 02

来源:互联网 发布:淘宝usa商城卖假货? 编辑:程序博客网 时间:2024/05/16 16:06

上一篇介绍了表达式树的一些基本用法,这里介绍下包含更复杂逻辑的表达式树。

1.判断逻辑的表达式树

LabelTarget labelBreak = Expression.Label();ParameterExpression loopIndex = Expression.Parameter(typeof(int), "index");BlockExpression block = Expression.Block(            new[] { loopIndex },                // 初始化loopIndex =1                Expression.Assign(loopIndex, Expression.Constant(1)),                Expression.Loop(                    Expression.IfThenElse(                // if 的判断逻辑                        Expression.LessThanOrEqual(loopIndex, Expression.Constant(10)),                // 判断逻辑通过的代码                        Expression.Block(                            Expression.Call(                                null,                                typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),                                Expression.Constant("Hello")),                            Expression.PostIncrementAssign(loopIndex)),                // 判断不通过的代码                        Expression.Break(labelBreak)                        ), labelBreak));            // 将我们上面的代码块表达式Expression<Action> lambdaExpression = Expression.Lambda<Action>(block);lambdaExpression.Compile().Invoke();
这个表达式阅读起来有点费劲,不过仔细读一下还是比较好理解的。

2.类型判断的表达式树

TypeBinaryExpression typeBinaryExpression =                Expression.TypeIs(                    //Expression.Constant(3),                    Expression.Constant("Hello"),                    typeof(int));Console.WriteLine(typeBinaryExpression.ToString());BlockExpression block = Expression.Block(typeBinaryExpression);Expression<Func<bool>> e = Expression.Lambda<Func<bool>>(block);Console.WriteLine(e.Compile().DynamicInvoke());
这个表达式树是构建了一个类型判断的表达式,我们首先打印出表达式,然后我们调用表达式。





0 0