C 表示式樹Expression

2022-10-08 19:09:09 字數 2969 閱讀 2521

表示式相加

//常量表示式

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 的只...