全球共有10多个国家和地区1000多个平台,20万+商户使用
Expression表达式目录树
作者: 李炳坤 发布时间: 2024-03-23 235 分类专栏: 后端开发
1. 基本了解
1.1 Lambda表达式
Lambda
表达式是一个特殊的匿名函数,是一种高效的类似于函数式编程的表达式,简化开发中需要编写的代码量
可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式
所有Lambda
表达式都使用Lambda
运算符=>
,运算符的左边是输入参数(如果有),右边是表达式或语句块
Lambda
表达式不能在委托链中进行删(-=
)操作,因为每个表达式的名称都不一样
2. 表达式目录树Expression
2.1 简单概述
表达式树,Expression
(System.Linq.Expressions
),是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算,或者说是描述不同变量和常用之间关系的一种数据结构
表达式目录树以数据形式表示语言级别代码,数据存储在树形结构中,目录树中的每个节点都表示一个表达式,简单的说是一种语法树,或者说是一种数据结构
表达式目录树不能有语句体,不能当作方法,不能有大括号,只能有一行代码
2.2 声明表达式目录树
第一种方式,快捷声明,用
Lambda
声明表达式目录树
示例一:普通类型
Expression<Func<int, int, int>> exp = (n, m) => n * m + 2;
示例二:实体类声明
Expression<Func<User, bool>> lambda = x => x.age > 18;
第二种方式,手动拼装目录树(原始方式),简单示例
namespace e1
{
using System;
using System.Linq.Expressions;
class Program
{
static void Main(string[] args)
{
// 以此表达式为例,手动拼接,实现相同作用
Expression<Func<int, int, int>> func = (x, y) => x * y + 2;
// 声明变量表达式
ParameterExpression px = Expression.Parameter(typeof(int), "x");
ParameterExpression py = Expression.Parameter(typeof(int), "y");
// 声明常量表达式
ConstantExpression constant = Expression.Constant(2, typeof(int));
// 声明乘积表达式
BinaryExpression multiply = Expression.Multiply(px, py);
// 声明相加表达式
BinaryExpression add = Expression.Add(multiply, constant);
// 声明参数表达式
ParameterExpression[] parameters = new ParameterExpression[] { px, py };
// 生成表达式目录树
Expression<Func<int, int, int>> exp = Expression.Lambda<Func<int, int, int>>(add, parameters);
// 表达式目录树生成委托
var ifunc = exp.Compile();
Console.WriteLine("委托结果:" + func.Compile().Invoke(1, 2));
Console.WriteLine("表达式树:" + ifunc.Invoke(1, 2));
}
}
}
2.3 表达式类型
方法 | 类型 | 描述 |
---|---|---|
Expression.Parameter(...) | ParameterExpression | 表示一个命名参数(变量)表达式 |
Expression.Constant(...) | ConstantExpression | 表示具有常量值的表达式 |
Expression.Add(...) | BinaryExpression | 表示具有(+,-,*,/ )运算的表达式 |
Expression.Property/Field(...) | MemberExpression | 表示访问属性或字段 |
Expression.Call(...) | MethodCallExpression | 表示对静态方法或实例方法的调用 |
Expression.Condition(...) | ConditionalExpression | 表示包含条件运算符的表达式 |
LambdaExpression | 描述一个Lambda表达式 | |
ListInitExpression | 表示包含集合初始值设定项的构造函数调用 | |
NewExpression | 表示构造函数调用 | |
NewArrayExpression | 表示创建新数组并可能初始化改数组的元素 | |
MemberMemberBinding | 表示初始化新创建对象的成员的成员 | |
MemberInitExpression | 表示调用构造函数并初始化新对象的一个或多个成员 | |
MemberAssignment | 表示初始化新创建对象的字段或属性 | |
InvocationExpression | 表示将委托或Lambda表达式应用于参数表达式列表的表达式 | |
TypeBinaryExpression | 表示表达式和类型之间的操作 | |
UnaryExpression | 表示包含一元运算符的表达式 |
3. 应用:解析Expression示例
3.1 示例一:简单示例,生成SQL
using System;
using System.Linq.Expressions;
namespace e2
{
internal static class SqlOperator
{
internal static string ToSqlOperator(this ExpressionType type)
{
switch (type)
{
case (ExpressionType.AndAlso):
case (ExpressionType.And):
return "AND";
case (ExpressionType.OrElse):
case (ExpressionType.Or):
return "OR";
case (ExpressionType.Not):
return "NOT";
case (ExpressionType.NotEqual):
return "<>";
case ExpressionType.GreaterThan:
return ">";
case ExpressionType.GreaterThanOrEqual:
return ">=";
case ExpressionType.LessThan:
return "<";
case ExpressionType.LessThanOrEqual:
return "<=";
case (ExpressionType.Equal):
return "=";
default:
throw new Exception("不支持该方法");
}
}
}
}
Expression
一般都是都是配合委托一起来使用的,比如和委托Action
,Func
Expression<Func<T>>
是可以转成Func
的(通过compile()
方法转换),反之则不行
李炳坤
小当家ISV,重庆APP开发,小程序开发,软件系统开发 地址:重庆市南岸区南坪万达广场写字楼2栋19-6 联系电话:023-81361879
ICP备案号:渝ICP备15003473-1 增值电信业务许可证: 渝B2-15003473 渝公网安备 50010802005103号
友情链接: 小当家点餐收银系统 MagicShop商城 重庆微信营销 重庆智能家居 重庆红岭医院
重庆小当家互联网信息技术有限公司