C# 表達式樹Expression


表達式相加

//常量表達式
Expression firstArg = Expression.Constant(2);
Expression secondArg = Expression.Constant(4);

//相加
Expression addExpression = Expression.Add(firstArg, secondArg);
Console.WriteLine(addExpression.ToString());

將表達式編譯成委托

Console.WriteLine("將表達式編譯成委托");
Expression<Func<int>> expression = Expression.Lambda<Func<int>>(addExpression);
Console.WriteLine(expression);

var func = expression.Compile();
Console.WriteLine(func);
Console.WriteLine("結果:" + func());

將Lamda表達式轉換成表達式

Expression<Func<int>> expression = () => 5;

Console.WriteLine(expression);
Console.WriteLine(expression.Compile());
Console.WriteLine(expression.Compile()());

獲得表達式信息

Expression<Func<int, int, double, double>> expression = (num1, num2, num3) => (num1 + 5) * num2 / num3;
Console.WriteLine(expression.ToString());
Console.WriteLine(expression.Compile());
Console.WriteLine(expression.Compile()(1, 2, 3));

if (expression.NodeType == ExpressionType.Lambda)
{
    //LambdaExpression繼承於Expression
    var lambdaExpression = expression as LambdaExpression;
    Console.WriteLine(lambdaExpression.Body);
    Console.WriteLine("返回值類型:" + lambdaExpression.ReturnType.ToString());

    IReadOnlyList<ParameterExpression> parameters = lambdaExpression.Parameters;

    foreach (var parameter in parameters)
    {
        Console.WriteLine("形參名: " + parameter.Name);
        Console.WriteLine("形參類型: " + parameter.Type.Name);
    }
}

拆分左右節點

Console.WriteLine("表達式詳細信息");
Console.WriteLine();

//基本信息
Expression<Func<int, int, int>> sumExpression = (num1, num2) => num1 + (5 + num2);
Console.WriteLine($"根節點的節點類型:{sumExpression.NodeType}");
Console.WriteLine($"根節點的類型:{sumExpression.Type.Name}");
Console.WriteLine($"根節點的名字:{sumExpression.Name}");
Console.WriteLine($"根節點的代碼:{sumExpression.ToString()}");
Console.WriteLine();

//形參
Console.WriteLine($@"表達式的形參:{sumExpression.Parameters.Count}個,");
foreach (var item in sumExpression.Parameters)
{
    Console.WriteLine($"節點的節點類型:{sumExpression.Parameters[0].NodeType},");
    Console.WriteLine($"類型:{sumExpression.Parameters[0].Type.Name},");
    Console.WriteLine($"參數的名字:{sumExpression.Parameters[0]}");
}
Console.WriteLine();

//Body
var sumBody = sumExpression.Body as BinaryExpression;

Console.WriteLine($"主體節點的節點類型:{sumBody.NodeType}");
Console.WriteLine($"主體節點代碼:{sumBody.ToString()}");
Console.WriteLine();

//左節點
var leftNode = sumBody.Left as ParameterExpression;
Console.WriteLine($"主體左節點:{leftNode.ToString()}");
Console.WriteLine($"主體左節點的節點類型:{leftNode.NodeType}");
Console.WriteLine($"主體左節點的類型:{leftNode.Type.Name}");
Console.WriteLine($"主體左節點的名字:{leftNode.Name}");
Console.WriteLine();

//右節點
var rightNode = sumBody.Right as BinaryExpression;
Console.WriteLine($"主體右節點:{rightNode.ToString()}");
Console.WriteLine($"主體右節點的節點類型:{rightNode.NodeType}");
Console.WriteLine($"主體右節點的類型:{rightNode.Type.Name}");
Console.WriteLine();

//繼續拆分右節點
//(5 + num2)
//右節點的左節點
var rightLeftNode = rightNode.Left as ConstantExpression;
Console.WriteLine($"右節點的左節點:{rightLeftNode.ToString()}");
Console.WriteLine($"右節點的左節點的節點類型:{rightLeftNode.NodeType}");
Console.WriteLine($"右節點的左節點的類型:{rightLeftNode.Type.Name}");
Console.WriteLine();

//右節點的右節點
var rightRightNode = rightNode.Right as ParameterExpression;
Console.WriteLine($"右節點的右節點:{rightRightNode.ToString()}");
Console.WriteLine($"右節點的右節點的節點類型:{rightRightNode.NodeType}");
Console.WriteLine($"右節點的右節點的類型:{rightRightNode.Type.Name}");
Console.WriteLine($"右節點的右節點的名字:{rightRightNode.Name}");

示例代碼

ExpressionTestDemo

參考資料

表達式樹 (C#)
Expression.NodeType 屬性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM