표현나무는 Linq의 핵심 중 하나라고 할 수 있습니다. 왜 Linq의 핵심 중 하나인가요? 표현식 트리는 C#이 더 이상 단순히 IL로 컴파일되지 않도록 하기 때문에 C#을 통해 표현식 트리를 생성하고 그 결과를 중간 형식으로 사용하고 대상 플랫폼에서 기본 언어로 변환할 수 있습니다. SQL과 같은. 이것이 우리가 일반적으로 사용하는 Linq to sql이 SQL을 생성하는 방법입니다.
Expression tree는 .NET 3.5 이후에 도입된 강력하고 유연한 도구입니다(예: LINQ에서 동적 쿼리를 구성하는 데 사용됨).
먼저 Expression 클래스의 API 인터페이스를 살펴보겠습니다.
namespace System.Linq.Expressions { // // 摘要: // 以表达式目录树的形式将强类型 lambda 表达式表示为数据结构。此类不能被继承。 // // 类型参数: // TDelegate: // System.Linq.Expressions.Expression`1 表示的委托的类型。 public sealed class Expression<TDelegate> : LambdaExpression { // // 摘要: // 将表达式树描述的 lambda 表达式编译为可执行代码,并生成表示该 lambda 表达式的委托。 // // 返回结果: // 一个 TDelegate 类型的委托,它表示由 System.Linq.Expressions.Expression`1 描述的已编译的 lambda 表达式。 public TDelegate Compile(); // // 摘要: // 生成表示 lambda 表达式的委托。 // // 参数: // debugInfoGenerator: // 编译器用于标记序列点并批注局部变量的调试信息生成器。 // // 返回结果: // 包含 lambda 的已编译版本的委托。 public TDelegate Compile(DebugInfoGenerator debugInfoGenerator); // // 摘要: // 创建一个与此表达式类似的新表达式,但使用所提供的子级。如果所有子级都相同,则将返回此表达式。 // // 参数: // body: // 结果的 System.Linq.Expressions.LambdaExpression.Body 属性。 // // parameters: // 结果的 System.Linq.Expressions.LambdaExpression.Parameters 属性。 // // 返回结果: // 此表达式(如果未更改任何子级),或带有更新的子级的表达式。 public Expression<TDelegate> Update(Expression body, IEnumerable<ParameterExpression> parameters); protected internal override Expression Accept(ExpressionVisitor visitor); } }
익스프레션 트리의 구문은 다음과 같습니다.
Expression<Func<type,returnType>> = (param) => lamdaexpresion;
예:
Expression<Func<int, int, int>> expr = (x, y) => x+y;
위 코드를 실행합니다. VS 디버깅 시뮬레이션 표현식 트리에서 이를 확인하세요.
표현식 트리는 주로 다음 네 부분으로 구성되어 있음을 알 수 있습니다.
1. 본문 주요 부분
2.
3. NodeType 노드 유형
4. 람다 표현식 유형
위 코드에서 본체는 x+y이고, 매개변수는 (x, y)이고, NodeType은 람다 표현식입니다. 반환 값은 int주요 부분은 표현식일 수 있지만 명령문은 포함할 수 없습니다. 예를 들어, 대리자를 정의하면 람다 표현식은Func<int, int, int> func = (x, y) => x + y;
Func<int, int, int> func = (x, y) => { return x + y; };
문 본문이 있는 람다 식을 식 트리로 변환할 수 없습니다.
위의 작성 방법 외에도 표현식 트리를 다음과 같이 작성할 수도 있습니다.
ParameterExpression pex1 = Expression.Parameter(typeof(int), "x");//第一个参数 ParameterExpression pex2 = Expression.Parameter(typeof(int), "y");//第二个参数 BinaryExpression bexp = Expression.Add(pex1, pex2);//加法 var lambdaExp = Expression.Lambda<Func<int, int, int>>(bexp, new ParameterExpression[] {pex1,pex2 });
표현 교체 대리자로 컴파일된 트리
LambdaExpression은 Expression에서 파생된 유형입니다. 일반 클래스 ExpressionExpression<Func<int, int, int>> expr = (x, y) => x + y; ParameterExpression pex1 = Expression.Parameter(typeof(int), "x");//第一个参数 ParameterExpression pex2 = Expression.Parameter(typeof(int), "y");//第二个参数 BinaryExpression bexp = Expression.Add(pex1, pex2);//主体,加法 //使用Expression.Lambda方法,创建一个委托类型已知的Expression Expression<Func<int,int,int>> lambdaExp = Expression.Lambda<Func<int, int, int>>(bexp, new ParameterExpression[] { pex1, pex2 }); Func<int,int,int> tDelegate = lambdaExp.Compile();//编译成委托 Console.WriteLine(tDelegate(1, 3)); Console.Read();
위 내용은 C#의 표현식 트리에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!