C#表达式树的基本用法讲解
表达式树使用一种类似树的结构来表示代码,它的每个节点都是一个表达式,比如方法调用和x 这一系列文章,主要是对C#表达式树的一种总结,基本知识参考MSDN的内容这部分内容可以直接到MSDN上查看,后面的几篇文章主要分享一下,在工作中碰到的应用到表达式树的部分,谨做为记录和分享。 生成表达式树 通过lambda表达式创建表达式树 通过API创建表达式树 使用API创建表达式,需要使用Expression类,这个类包含了创建特定类型表达式树节点的静态工厂方法,比如表示参数的变量ParameterExpression,表示方法调用的MethodExpression。ParameterExpression,MethodExpression以及其他特定的表达式类型都在System.Linq.Expression命名空间里定义,这些类型都派生于Expression抽象类。 下面的例子是使用API方式创建num=>num<5的lambda表达式对应的表达式树: 从.NETFramework4开始,表达式树API还支持赋值以及流程控制,比如循环,条件块和try...catch块等。相对于通过lambda表达式创建表达式树,可以利用API创建更加复杂的表达式树,比如下面使用API创建数字阶乘的表达式树: 解析表达式树 在获取了表达式树之后,如何获取表达式树的每一个部分,这个在有些情况下非常有用,下面这个例子展示了如何获取num=>num<5的各个部分。 编译表达式树 Expression 再比如,下面例子演示了,创建一个表达式树,然后编译执行: 表达式树的修改 表达式树是不可变对象(immutable),跟string类似,不能直接修改,只能复制一个然后重新构造。具体参考MSDNHowtomodifyexpressiontrees(C#). 结语 本篇全部内容参考MSDN上表达式树部分的内容,如果有基础建议直接看,这里只是个人作为笔记,也是表达式树的最基础部分,后文会介绍表达式树的一些用法。 以上就是C#表达式树的基本用法讲解的详细内容,更多关于C#表达式树的资料请关注毛票票其它相关文章! 声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
可以通过将lambda表达式赋值给Expression
Expression
ParameterExpressionnumPara=Expression.Parameter(typeof(int),"num");//参数num
ConstantExpressionfive=Expression.Constant(5,typeof(int));//常数5
BinaryExpressionnumLessThanFive=Expression.LessThan(numPara,five);
Expression
//参数value
ParameterExpressionvalue=Expression.Parameter(typeof(int),"value");
//本地变量
ParameterExpressionresult=Expression.Parameter(typeof(int),"result");
//标签,用来跳出循环
LabelTargetlabel=Expression.Label(typeof(int));
//创建表达式块
BlockExpressionblock=Expression.Block(
//添加本地参数result
new[]{result},
//result=1赋值
Expression.Assign(result,Expression.Constant(1)),
//循环
Expression.Loop(
//循环条件
Expression.IfThenElse(
//如果value>1
Expression.GreaterThan(value,Expression.Constant(1)),
//则result*=value--;
Expression.MultiplyAssign(result,Expression.PostDecrementAssign(value)),
//否则跳出loop循环。跳到label的语句执行
Expression.Break(label,result)
),
label
)
);
//编译表达式树
Func
Expression
//创建表达式树
Expression
//创建表达式树的执行逻辑
BinaryExpressionbe=Expression.Power(Expression.Constant(2D),Expression.Constant(3D));
//创建表达式树
Expression