zoukankan      html  css  js  c++  java
  • 解析 Lambda 表达式

    我们先创建一个表达式树:

    Expression<Func<int, int, int>> expression = (a,b) => a + b;
    我们的例子是一个Expression<TDelegate>。Expression<TDelegate>类有四个属性:
    • Body: 得到表达式的主体。
    • Parameters: 得到lambda表达式的参数.
    • NodeType: 获取树的节点的ExpressionType。共45种不同值,包含所有表达式节点各种可能的类型,例如返回常量,例如返回参数,例如取两个值的小值(<),例如取两个值的大值(>),例如将值相加(+),等等。
    • Type: 获取表达式的一个静态类型。在这个例子里,表达式的类型是Func<intintint>

    下面就写Code来解析

                Expression<Func<int, int, int>> expression = (a, b) => a + b;
                BinaryExpression body = (BinaryExpression)expression.Body;
                ParameterExpression left = (ParameterExpression)body.Left;
                ParameterExpression right = (ParameterExpression)body.Right;
                Console.WriteLine(expression.Body);
                Console.WriteLine(" 表达式左边部分: " + "{0}{4} 节点类型: {1}{4} 表达式右边部分: {2}{4} 类型: {3}{4}", left.Name, body.NodeType, right.Name, body.Type, Environment.NewLine);
    View Code

    输出:

      (a + b)
      表达式左边部分: a
      节点类型:  Add
      表达式右边部分: b
      类型: System.Int32

    我们可以调用Compile()方法来生成委托对象

    int res = expression.Compile()(3, 5); 

    这段代码会输出值8,跟本文最初声明的lambda函数的执行结果一样。

    Expression参考博客:http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html

  • 相关阅读:
    Session cookie 原理
    asp.net core service mesh
    js 常用库
    asp.net core consul
    asp.net core polly
    asp.net core ocelot
    第十五章 享元模式 Flyweight
    第十四章 策略模式 Strategy
    mysql 主从复制
    mysql 执行计划
  • 原文地址:https://www.cnblogs.com/zuqing/p/4525831.html
Copyright © 2011-2022 走看看