博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LINQ Provider 表达式树 5
阅读量:4950 次
发布时间:2019-06-11

本文共 1473 字,大约阅读时间需要 4 分钟。

访问与修改表达式目录树

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

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

 

输出后为:

现在我们想要修改表达式目录树,让它表示的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
> lambda = (a, b) => a + b * 2; var operationsVisitor = new OperationsVisitor(); Expression modifyExpression = operationsVisitor.Modify(lambda); Console.WriteLine(modifyExpression.ToString());}

运行后可以看到输出:

TerryLee_0165

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

转载于:https://www.cnblogs.com/meilibao/archive/2012/09/12/2681341.html

你可能感兴趣的文章