C# 表示式樹Expression
阿新 • • 發佈:2022-03-10
表示式相加
//常量表達式
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}");