.NET 表达式树(Expression Tree) 执行命令

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

.NET 表达式树(Expression Tree) 执行命令

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());

.NET 表达式树(Expression Tree) 执行命令