表示式相加
//常量表示式
expression firstarg = expression.constant(2);
expression secondarg = expression.constant(4);
//相加
expression addexpression = expression.add(firstarg, secondarg);
console.writeline(addexpression.tostring());
將表示式編譯成委託
console.writeline("將表示式編譯成委託");
expression> expression = expression.lambda>(addexpression);
console.writeline(expression);
var func = expression.compile();
console.writeline(func);
console.writeline("結果:" + func());
將lamda表示式轉換成表示式
expression> expression = () => 5;
console.writeline(expression);
console.writeline(expression.compile());
console.writeline(expression.compile()());
expression> 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)
}
拆分左右節點
console.writeline("表示式詳細資訊");
console.writeline();
//基本資訊
expression> sumexpression = (num1, num2) => num1 + (5 + num2);
console.writeline($"根節點的節點型別:");
console.writeline($"根節點的型別:");
console.writeline($"根節點的名字:");
console.writeline($"根節點的**:");
console.writeline();
//形參
console.writeline($@"表示式的形參:個,");
foreach (var item in sumexpression.parameters)
,");
console.writeline($"型別:,");
console.writeline($"引數的名字:");
}console.writeline();
//body
var sumbody = sumexpression.body as binaryexpression;
console.writeline($"主體節點的節點型別:");
console.writeline($"主體節點**:");
console.writeline();
//左節點
var leftnode = sumbody.left as parameterexpression;
console.writeline($"主體左節點:");
console.writeline($"主體左節點的節點型別:");
console.writeline($"主體左節點的型別:");
console.writeline($"主體左節點的名字:");
console.writeline();
//右節點
var rightnode = sumbody.right as binaryexpression;
console.writeline($"主體右節點:");
console.writeline($"主體右節點的節點型別:");
console.writeline($"主體右節點的型別:");
console.writeline();
//繼續拆分右節點
//(5 + num2)
//右節點的左節點
var rightleftnode = rightnode.left as constantexpression;
console.writeline($"右節點的左節點:");
console.writeline($"右節點的左節點的節點型別:");
console.writeline($"右節點的左節點的型別:");
console.writeline();
//右節點的右節點
var rightrightnode = rightnode.right as parameterexpression;
console.writeline($"右節點的右節點:");
console.writeline($"右節點的右節點的節點型別:");
console.writeline($"右節點的右節點的型別:");
console.writeline($"右節點的右節點的名字:");
示例**
expressiontestdemo
參考資料
表示式樹 (c#)
expression.nodetype 屬性
LINQ 表示式樹 Expression
在 linq to objects 中,擴充套件方法需要將乙個委託型別作為引數,這樣就可以將 表示式賦予引數。達式也可以賦予expression型別的引數。expression型別指定,來自於 表示式的表示式樹儲存在程式集中。這樣,就可以在執行期間分析表示式,並進行優化,以便於查詢資料來源。下面看看...
LINQ 表示式樹 Expression
在 linq to objects 中,擴充套件方法需要將乙個委託型別作為引數,這樣就可以將 表示式賦予引數。達式也可以賦予expression型別的引數。expression型別指定,來自於 表示式的表示式樹儲存在程式集中。這樣,就可以在執行期間分析表示式,並進行優化,以便於查詢資料來源。下面看看...
EXpression 表示式目錄樹
表示式樹 前面n 1的是乙個表示式 最後乙個是乙個表示式 一直拆開拆到最後 繼承expressionvisitor的類 可以重寫獲取到表示式樹的方法進行擴張和改寫 委託是編譯成乙個方法 表示式樹不是的 是一種資料結構 但是通過exp.compile 方法編譯後就是乙個委託 能進行compile 的只...