《c#进阶》--04.表达式树


提示:以下是本篇文章正文内容,下面案例可供参考

一、基本概念

  • 委托是表达式目录树的一个参数类型
  • 表达式树是用于描述一个方法的方式,必须调用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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值