0x01 基本介绍
.NET 表达式树是存储委托的容器,是一种存取Lambda表达式的数据结构,位于System.Linq.Expression命名空间下,基本语法如下
1、定义参数
ParameterExpression fromParameter = Expression.Parameter(typeof(string), "from");
2、定义局部变量.
ParameterExpression partsVariable = Expression.Variable(typeof(string[]), "parts");
ParameterExpression iVariable = Expression.Variable(typeof(int), "i");
ParameterExpression lengthVariable = Expression.Variable(typeof(int), "length");
ParameterExpression arrayVariable = Expression.Variable(typeof(int[]), "array");
3、赋值常量
Expression.Assign(iVariable, Expression.Constant(10))
4、编译表达式
Func<string, int[]> convertToArray = Expression.Lambda<Func<string, int[]>>(block, fromParameter).Compile();
Expression类中提供了大量的工厂方法,这些方法负责创建以上各种表达式对象,.NET内置提供了很多表达式,具体详情如图1
0x02 执行命令
这里我们仍要使用诸多表达式中与众不同的LambdaExpression。.Compile是将Lambda表达式的表达式树真的编译成一个.NET方法,Expression.Call表示调用方法,调用Process类启动进程如下
var param = Expression.Parameter(typeof(Object), null);
var method = Expression.Call(
typeof(System.Diagnostics.Process).GetMethod("Start", new Type[] { typeof(String) }),
Expression.Constant("calc")
);
var lambda = Expression.Lambda<Action<Object>>(method,param);
lambda.Compile()(new Object());