上一篇介绍了表达式树的一些基本用法,这里介绍下包含更复杂逻辑的表达式树。
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());
这个表达式树是构建了一个类型判断的表达式,我们首先打印出表达式,然后我们调用表达式。