你应该随遇而安,尽可能地享受生活。
Program.cs代码:
internal class Program
{
private static void Main(string[] args)
{
MethodOne();
MethodTwo();
MethodThree();
MethodFour();
Console.WriteLine();
}
private static void MethodOne()
{
//快速创建表达式树
Expression<Func<int, bool>> lambda = num => num < 5;
Console.WriteLine(lambda.Compile()(5));
Console.ReadLine();
}
private static void MethodTwo()
{
//手动创建表达式树
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numLessThanFive = Expression.LessThan(numParam, five);
var exp = Expression.Lambda<Func<int, bool>>(numLessThanFive, new ParameterExpression[] { numParam });
Console.WriteLine(exp.Compile()(10));
Console.ReadLine();
}
//要使用API创建表达式树,需要使用Expression类。该类提供创建特定类型的表达式树节点的静态方法,
//例如:ParameterExpression(表示一个变量或参数)或MethodCallExpression(表示一个方法调用)。
//下面演示使用API创建一个表达式树:
private static void MethodThree()
{
ParameterExpression value = Expression.Parameter(typeof(int), "value");
ParameterExpression result = Expression.Parameter(typeof(int), "result");
//创建要从循环跳出的标签。
LabelTarget label = Expression.Label(typeof(int));
//创建一个 System.Linq.Expressions.BlockExpression,其中包含给定的变量和表达式。
// 表示一个包含可在其中定义变量的表达式序列的块。
BlockExpression block = Expression.Block(new[] { result }, //声明 result 范围变量
//创建一个表示赋值运算的 System.Linq.Expressions.BinaryExpression。
Expression.Assign(result, Expression.Constant(1)),
//创建具有给定主体和中断目标的 System.Linq.Expressions.LoopExpression。
Expression.Loop(
//判断分支if(){}else{}
Expression.IfThenElse(
Expression.GreaterThan(value, Expression.Constant(1)),
Expression.MultiplyAssign(result, Expression.PostDecrementAssign(value)),
Expression.Break(label, result)
),
label
)
);
//将表达式树描述的lambda表达式编译为可执行代码,并生成表示该lambda表达式的委托
//Func<int, int> haha = Expression.Lambda<Func<int, int>>(block, value).Compile();
int factorial = Expression.Lambda<Func<int, int>>(block, value).Compile()(5);
Console.WriteLine("阶乘的结果:" + factorial);
Console.ReadLine();
}
private static void MethodFour()
{
//可以看到表达式树主要由下面四部分组成:
//1、Body 主体部分
//2、Parameters 参数部分
//3、NodeType 节点类型
//4、Lambda表达式类型
//将Lambda表达式转换为类型Expression<T>的表达式树
//exprTree不是可执行代码
Expression<Func<int, bool>> exprTree = num => num < 5;
//参数表达式
var param = exprTree.Parameters[0];
//操作符
var operation = (BinaryExpression)exprTree.Body;
//左子树
var left = (ParameterExpression)operation.Left;
//右子树
var right = (ConstantExpression)operation.Right;
Console.WriteLine("分解表达式: {0} => {1} {2} {3}", param.Name, left.Name, operation.NodeType, right.Value);
Console.ReadLine();
}
}
运行结果如图: