.Net 中表達式的轉換express
如: a>0 && (c>a || a <b ) || (a>b || c>1) 轉換後 (((a > 0) and ((c > a) OR (a < b))) OR ((a > b) OR (c > 1))) 函數
本文主要用到了 表達式樹(Expression Tree) , 表達式樹相關知識(https://msdn.microsoft.com/zh-cn/library/system.linq.expressions.expression.aspx) spa
本實例 只是 拋磚引玉, 不足的地方 你們補充。code
仍是直接貼代碼吧。 blog
private void button1_Click(object sender, EventArgs e) { //這裏就先寫一個吧。 Expression<Func<int, int, int, bool>> m = (a, b, c) => a > 0 && (c > a || a < b) || (a > b || c > 1); var cccc = AnalysisExpressionTree(m.Body); MessageBox.Show("解析後的表達式:" + cccc); //再運行一下 var run = m.Compile(); var result = run(2, 6, 9); MessageBox.Show("數據轉換成代碼運行後的結果:" + result.ToString()); }
/// <summary> /// 遞歸解析一下 表達式樹 /// </summary> /// <param name="m"></param> /// <returns></returns> private string AnalysisExpressionTree(Expression m) { var c = m as ConstantExpression; if (c != null) { return c.Value.ToString(); } var p = m as ParameterExpression; if (p != null) { return p.Name; } var u = m as UnaryExpression; if (u != null) { if (u.NodeType == ExpressionType.Not) { return "!(" + AnalysisExpressionTree(u.Operand) + ")"; } } var method = m as MethodCallExpression; if (method != null) { return "調用函數" + method.Method.Name + "(" + string.Join(",", method.Method.GetParameters().Select(pp => pp.Name)) + ")"; } var b = m as BinaryExpression; if (b != null) { switch (b.NodeType) { case ExpressionType.And: return "(" + AnalysisExpressionTree(b.Left) + " and " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.AndAlso: return "(" + AnalysisExpressionTree(b.Left) + " and " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.GreaterThan: return "(" + AnalysisExpressionTree(b.Left) + " > " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.LessThan: return "(" + AnalysisExpressionTree(b.Left) + " < " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.OrElse: return "(" + AnalysisExpressionTree(b.Left) + " OR " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.NotEqual: return "(" + AnalysisExpressionTree(b.Left) + " != " + AnalysisExpressionTree(b.Right) + ")"; //這裏還能夠再加 ,此例只是一個 DEMO } } return ""; }
OK , 就寫這些吧。 很久不寫博客了。源代碼 也發出來吧。遞歸