[Expression Tree] MSDN學習系列 2-修改運算式樹狀架構

     繼上篇運算式樹狀架構,此篇要講的是如何修改運算式樹狀架構,預設的情形下,運算式樹狀架構是不可直接修改的.....嗯~~~有看沒有懂…對吧..XD,下列程式碼,就是一個完整的樹狀結構,但你不可以直接去異動他任一節點,例如:將大於換小於、and換成or
Expression<Func<string, bool>> expr = name => name.Length > 10 && name.StartsWith("G");

若要修改運算式樹狀架構


繼承ExpressionVisitor,此類別會在樹狀結構被巡覽時叫用,而透過覆寫VisitBinary方法,可以針對特定的運算式作修改,以下列程式示範的是,若為And則修改成Or運算式,並將Left及Right以遞迴方式繼續巡覽(例:針對Left再作修改)
public class AndAlsoModifier : ExpressionVisitor
{
    public Expression Modify(Expression expression)
    {
        return Visit(expression);
    }

    protected override Expression VisitBinary(BinaryExpression node)
    {
        if (node.NodeType == ExpressionType.AndAlso)
        {
            Expression left = this.Visit(node.Left);//以遞迴方式繼續巡覽
            Expression right = this.Visit(node.Right);
            return Expression.MakeBinary(ExpressionType.OrElse, left, right, node.IsLiftedToNull, node.Method);
        }

        return base.VisitBinary(node);
    }

}

測試程式

    static void Main(string[] args)
        {
            Expression<Func<string, bool>> expr = name => name.Length > 10 && name.StartsWith("G");
            AndAlsoModifier treeModifier = new AndAlsoModifier();
            Expression modifiedExpr = treeModifier.Modify(expr);
            Console.WriteLine("修改前:" + expr);
            Console.WriteLine("修改後:" + modifiedExpr);
            Console.Read();
        }

image

參考來源

http://msdn.microsoft.com/zh-tw/library/bb546136.aspx

原始程式
https://github.com/kimx/ExpressionLab

這個網誌中的熱門文章

[TFS] 分支與合併

[.NET Core] 將專案發行至IIS