文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、基本概念
- 委托是表达式目录树的一个参数类型
- 表达式树是用于描述一个方法的方式,必须调用Combile编译后才能运行
- Expression 编译–Compile–得到一个委托
- Expression只能有一行代码一委托一方法一可以有多行
- 形似于二叉树的一个数据结构
二.基本使用
初识表达式树
两个功能一摸一样的语法,不同的是,委托可以直接使用,表达式树需要在编译后才能使用
public void test01()
{
//1.委托
Func<String> a = () => "hello world" ;
string str1 = a();
Console.WriteLine(str1);
//2.表达式树
Expression<Func<string>> b = () => "hello world";
//Compile编译后才能使用
string str2 = b.Compile().Invoke();
Console.WriteLine(str2);
}
查看反编译生成的代码,使用c#2.0可以查看到最终编译时生成的语法,比想象中复杂的多
原生语法使用
运算符基本使用
使用原生的语法去编写表达式树,了解底层的操作原理,是如何一步步拼接起来的,对我们后续的应用非常有帮助
1)案例一
无参返回值
public void test02()
{
Func<int> a = () => 5;
//使用Expression工具类去描述我们的方法
//1.先描述参数,参数没有可以不描述
//2.描述方法体
//2.1 此处方法体中只有一个常量()
ConstantExpression con = Expression.Constant(5);
//2.2 方法的结构是lambda,传入方法体的内容,以及lambda的参数
Expression.Lambda<Func<int>>(con,null);
}
2)案例二
有参返回值
public void test03()
{
Func<int,int> a = (para) => 5+para;
//1.先描述参数,参数的类型|参数名称
ParameterExpression pa = Expression.Parameter(typeof(int), "para");
//2.描述方法体
//2.1 一个常量5
ConstantExpression con = Expression.Constant(5);
//2.2 一个变量,这个变量其实就是参数,不需要再写
//2.3描述加法 5+pa
BinaryExpression ba = Expression.Add(con,pa);
//2.4 描述方法结构 pa=>5+pa
Expression<Func<int, int>> expression = Expression.Lambda<Func<int, int>>(ba,new ParameterExpression[] {
pa});
int result = expression.Compile().Invoke(3);
Console.WriteLine(result);
}
3)案例三
复杂表达式
public void test04()
{
Func<int, int, int> func = (a, b) => a + a * b - 3;
//1.先描述方法参数
ParameterExpression pa1 = Expression.Parameter(typeof(int), "a");
ParameterExpression pa2 = Expression.Parameter(typeof(int), "b");
//2.描述方法体
//2.1 描述常量3
ConstantExpression con = Expression.Constant(3);
//2.2先描述乘法
BinaryExpression mul = Expression.Multiply(pa1, pa2);
//2.3 描述加法 a+(a*b)
BinaryExpression b1 = Expression.Add(pa1,mul);
//2.4 描述加法 (a+a*b)-3
BinaryExpression body = Expression.Subtract(b1,con);
//2.5 描述整体结构
Expression<Func<int, int, int>> expression =
Expression.Lambda<Func<int, int, int>>(body, new ParameterExpression[] {
pa1,pa2});
int v = expression.Compile().Invoke(1,2);
Console.WriteLine(v);
}
面向对象的基本使用
class Person
{
public string name {
get; set; }
public int id {
get; set; }
}
------------------------------------------------------------------------
public void test05()
{
Func<Person,string> func=p=>p.id.ToString();
//1.描述参数
ParameterExpression pa1 = Expression.Parameter(ty