zoukankan      html  css  js  c++  java
  • LINQ Provider 表达式树 5

    访问与修改表达式目录树

    在本文一开始我就说过, 通过解析表达式目录树,我们可以实现一些特定功能,既然要解析表达式目录树,对于表达式目录树的访问自然是不可避免的。在.NET Framework中,提供了一个抽象的表达式目录树访问类ExpressionVisitor,但它是一个internal的,我们不能直接访问。幸运的是,在MSDN中微软给出了ExpressionVisitor类的实现,我们可以直接拿来使用。该类是一个抽象类,微软旨在让我们在集成ExpressionVisitor的基础上,实现自己的表达式目录树访问类。现在我们来看简单的表达式目录树:

    static void Main(string[] args)
    {
        Expression<Func<int, int, int>> lambda = (a, b) => a + b * 2;
        Console.WriteLine(lambda.ToString());
    } 

    输出后为:

    TerryLee_0164

    现在我们想要修改表达式目录树,让它表示的Lambda表达式为(a,b)=>(a - (b * 2)),这时就需要编写自己的表达式目录树访问器,如下代码所示:

    public class OperationsVisitor : ExpressionVisitor
    {
        public Expression Modify(Expression expression)
        {
            return Visit(expression);
        }
        protected override Expression VisitBinary(BinaryExpression b)
        {
            if (b.NodeType == ExpressionType.Add)
            {
                Expression left = this.Visit(b.Left);
                Expression right = this.Visit(b.Right);
                return Expression.Subtract(left,right);
            }
            return base.VisitBinary(b);
        }
    }

    使用表达式目录树访问器来修改表达式目录树,如下代码所示:

    static void Main(string[] args)
    {
        Expression<Func<int, int, int>> lambda = (a, b) => a + b * 2;
        var operationsVisitor = new OperationsVisitor();
        Expression modifyExpression = operationsVisitor.Modify(lambda);
        Console.WriteLine(modifyExpression.ToString());
    }

    运行后可以看到输出:

    TerryLee_0165

    似乎我们是修改表达式目录树,其实也不全对,我们只是修改表达式目录树的一个副本而已,因为表达式目录树是不可变的,我们不能直接修改表达式目录树,看看上面的OperationsVisitor类的实现大家就知道了,在修改过程中复制了表达式目录树的节点。

  • 相关阅读:
    composer 自动加载
    yii linux 上运行脚本 报PDO连接时,提示 Exception 'yiidbException' with message 'SQLSTATE[HY000] [2005] Unknown MySQL server host
    mac上修改php命令行的路径
    git .gitignore 不生效处理办法
    窗口最大化全屏化的方法
    MFC双缓冲解决图象闪烁[转]
    对话框窗口最大化盖住任务栏问题!OnGetMinMaxInfo,WM_GETMINMAXINFO
    关于二维数组传参做形参[转]
    cvLoadImage,cvCloneImage的内存泄露问题
    LPCTSTR和CString的关系
  • 原文地址:https://www.cnblogs.com/meilibao/p/2681341.html
Copyright © 2011-2022 走看看