栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

.Net C# Lambda表达式树

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.Net C# Lambda表达式树

表达式树是一种数据结构,表达式树配合Linq可以完成非常丰富的操作,还可以进行动态操作,例如使用Entity Framework进行数据库操作时,我们可以通过表达式树进行动态查询语句的生成。表达式树支持动态生成、修改(重新创建一棵树)。

我们看一下简单的代码:

class ExpressionDemo
    {
        public static void ExpMain()
        {
            //BinaryExpression--表示具有二进制运算符的表达式
            //ParameterExpression--表示一个命名的参数表达式
            //ConstantExpression--表示具有常数值的表达式
            //Expression--表达式树基类,以上类型均派生自Expression

            {
                Expression> expression = (x, y) => x * y;//生成乘法表达式
                var func = expression.Compile();//编译表达式
                Console.WriteLine(expression.Body + "=" + func(1, 2));//输出表达式并输出执行结果
                Expression> expression1 = (x, y) => x + y;//生成加法表达式
                var func1 = expression1.Compile();//编译表达式
                Console.WriteLine(expression1.Body + "=" + func1(1, 2));//输出表达式并输出执行结果
            }
            {
                ParameterExpression parameterX = Expression.Parameter(typeof(int), "x");//定义参数X
                ParameterExpression parameterY = Expression.Parameter(typeof(int), "y");//定义参数Y
                BinaryExpression binaryAdd = Expression.Add(parameterX, parameterY);//定义加法表达式(x+y)
                BinaryExpression binaryMultiply = Expression.Multiply(parameterX, parameterY);//定义乘法表达式(x*y)
                ConstantExpression constant = Expression.Constant(10, typeof(int));//定义常量10
                ConstantExpression constant2 = Expression.Constant(5, typeof(int));//定义常量5
                BinaryExpression binaryAdd2 = Expression.Add(binaryAdd, binaryMultiply);//(拼接)加法表达式 + 乘法表达式((x+y)+(x*y))
                BinaryExpression binaryAdd3 = Expression.Add(binaryAdd2, constant);//上一步表达式+常数表达式((x+y)+(x*y)+10) 加法运算
                BinaryExpression binarySubtract = Expression.Subtract(binaryAdd3, constant2);//上一步表达式-常数表达式(((x+y)+(x*y)+10)-5) 减法运算
                var expression = Expression.Lambda>(binarySubtract, parameterX, parameterY);//创建表达式树
                var func = expression.Compile();//编译表达式树并生成委托
                Console.WriteLine(expression.Body + "=" + func(2, 3));//输出表达式并输出执行结果
            }
            {
                ParameterExpression parameterX = Expression.Parameter(typeof(int), "x");//定义参数X
                ParameterExpression parameterY = Expression.Parameter(typeof(int), "y");//定义参数Y
                ConstantExpression constant = Expression.Constant(0, typeof(int));//定义常量0
                BinaryExpression binary = Expression.Equal(parameterX, parameterY);//(x==y)
                BinaryExpression binary1 = Expression.GreaterThan(parameterX, constant);//(x>0)
                BinaryExpression binary2 = Expression.GreaterThan(parameterY, constant);//(y>0)
                BinaryExpression binary3 = Expression.AndAlso(binary1, binary2);//((x>0)&&(y>0))
                BinaryExpression binary4 = Expression.And(binary, binary3);//(x==y)&((x>0)&&(y>0))
                var expression = Expression.Lambda>(binary4, parameterX, parameterY);
                var func = expression.Compile();
                Console.WriteLine(expression.Body + "=" + func(1, 1));//判断入参是否相等并且大于0
            }
        }
    }

运行结果:

 下面列出表达式树相关类型:

类型说明
BinaryExpression表示具有二进制运算符的表达式。
BlockExpression表示包含一个表达式序列的块,表达式中可定义变量。
CatchBlock表示 try 块中的 catch 语句。
ConditionalExpression表示具有条件运算符的表达式。
ConstantExpression表示具有常数值的表达式。
DebugInfoExpression发出或清除调试信息的序列点。 这使调试器能够在调试时突出显示正确的源代码。
DefaultExpression表示一个类型或空表达式的默认值。
DynamicExpression表示一个动态操作。
DynamicExpressionVisitor表示动态表达式树的访问者或重写者。
ElementInit表示 IEnumerable 集合的单个元素的初始值设定项。
Expression将强类型化的 Lambda 表达式表示为表达式树形式的数据结构。 此类不能被继承。
ExpressionVisitor表示表达式树的访问者或重写者。
GotoExpression表示无条件跳转。 这包括返回语句,break 和 continue 语句以及其他跳转。
IndexExpression表示对一个属性或数组进行索引。
InvocationExpression表示一个将委托或 Lambda 表达式应用到一个自变量表达式列表的表达式。
LabelExpression表示一个标签,可以将该标签放置在任何 Expression 上下文中。 如果已跳转到该标签,则它将获取由对应的 GotoExpression 提供的值。 否则,它接收 DefaultValue 中的值。 如果 Type 等于 System.Void,则不应提供值。
LabelTarget用于表示 GotoExpression 的目标。
LambdaExpression介绍 lambda 表达式。 它捕获一个类似于 .NET 方法主体的代码块。
ListInitExpression表示具有集合初始值设定项的构造函数调用。
LoopExpression表示无限循环。 可通过“中断”退出该循环。
MemberAssignment表示对象的字段或属性的赋值操作。
MemberBinding提供表示绑定的类派生自的基类,这些绑定用于对新创建对象的成员进行初始化。
MemberExpression表示访问字段或属性。
MemberInitExpression表示调用构造函数并初始化新对象的一个或多个成员。
MemberListBinding表示初始化新创建对象的一个集合成员的元素。
MemberMemberBinding表示初始化新创建对象的一个成员的成员。
MethodCallExpression表示对静态方法或实例方法的调用。
NewArrayExpression表示创建一个新数组,并可能初始化该新数组的元素。
NewExpression表示一个构造函数调用。
ParameterExpression表示一个命名的参数表达式。
RuntimeVariablesExpression一个为变量提供运行时读/写权限的表达式。
SwitchCase表示 SwitchExpression 的一个事例。
SwitchExpression表示一个控制表达式,该表达式通过将控制传递到 SwitchCase 来处理多重选择。
SymbolDocumentInfo存储用于发出源文件调试符号信息所必要的信息,尤其是文件名和唯一的语言标识符。
TryExpression表示一个 try/catch/finally/fault 块。
TypeBinaryExpression表示表达式和类型之间的操作。
UnaryExpression表示具有一元运算符的表达式。

表格中这些类型都继承自 Expression 类,可以使用该类型并配合相关派生类型生成任何你需要的表达式类型。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/911287.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号