反射與表示式樹的應用實列

2022-01-11 16:41:44 字數 3768 閱讀 4577

using

system;

using

system.collections.generic;

using

system.diagnostics;

using

system.linq;

using

system.linq.expressions;

using

system.reflection;

using

system.text;

using

system.threading.tasks;

namespace

表示式樹

blockexpression blockexp =expression.block

(expression.call

(null

,

typeof(console).getmethod("

write

", new ),

expression.constant(

"hello world")

),expression.constant(42)

);expression

int>> lambdblock = expression.lambdaint>>(blockexp);

console.writeline(lambdblock.compile()());

//4.通過 expression 類建立表示式樹

//lambda:num => num == 0

parameterexpression pexpression = expression.parameter(typeof(int),"

num"); //

引數:num

constantexpression cexpression = expression.constant(0); //

常量:0

//binaryexpression bexpression = expression.makebinary(expressiontype.equal, pexpression, cexpression);

//表示式:num == 0

binaryexpression bexpression=expression.equal(pexpression, cexpression);

expression

int, bool>> lambda = expression.lambdaint, bool>>(bexpression, pexpression); //

lambda 表示式:num => num == 0

console.writeline(lambda.compile()(12

));

//5.表示式與反射應用

//請用表示式實現乙個動態邏輯,可以更新任意一種資料實體類的集合,比如list中每乙個元素的指定屬性;

book b1 = new book() ;

list

list_book = new list();

for (int i = 0; i < 1000000; i++)

var sw = new

stopwatch();

sw.start();

////表示式優化

setallproperty_expstring>(list_book, "

author

", "

123"

); sw.stop();

console.writeline(

"表示式優化耗時:

" +sw.elapsedmilliseconds);

sw.restart();

////反射

setallproperty(list_book, "

author

", "

458"

); sw.stop();

console.writeline(

"反射耗時:

" +sw.elapsedmilliseconds);

//6. 思考題a. xy+x+y

//法一

expressionint, int, int>> lambdex = (x, y) => x * y + x +y;

console.writeline(

"表示式:

" + lambdex + "

,值:" + lambdex.compile()(1, 2

));

////法二

var xexp = expression.parameter(typeof(int), "x"

);

var yexp = expression.parameter(typeof(int), "y"

);

var xyexp =expression.multiply(xexp, yexp);

var xplusyexp =expression.add(xexp, yexp);

var exp =expression.add(xyexp, xplusyexp);

expression

int, int, int>> lambdexp1 = expression.lambdaint, int, int>>(exp, new

); func

del =lambdexp1.compile();

console.writeline(

"表示式:

" + lambdexp1 + "

,值:" + del(1, 2

));

//思考題b. console.writeline("hi")

//法一

expressionstring>> lambdexp2 = (h) =>console.writeline(h);

lambdexp2.compile()("hi

");console.writeline(lambdexp2);

//法二

var parameterexp = expression.parameter(typeof(string), "h"

);

var methodinfo = typeof(console).getmethod("

writeline

", new );

var bodyexp = expression.call(null

, methodinfo, parameterexp);

var lambdexp = expression.lambdastring>>(bodyexp, parameterexp);

lambdexp.compile()(

"h12");

console.readkey();

}class

book

public

string name

}static

void setallproperty(listlist, string propertyname, object

propertyvalue)

}static

void setallproperty_exp(listlist,string

propertyname,k propertyvalue)}}

}

字尾表示式 2 表達樹與字尾表示式的運算

這裡,我們依然假設運算子都是二元的,這樣構造出來的表達樹必然是乙個二叉樹。對於乙個給定的字尾表示式,它表達樹的根節點是該表示式最外層的運算子。根節點的左右子樹分別為該運算子的第乙個和第二個運算元。這兩個運算元可能是樹,也可能是字尾子式對應的表達樹。例.對於如下字尾式 ab 其對應的表達樹為 a b例...

C 3 0 Lamdba表示式與表示式樹

c 2.0中的匿名方法使得建立委託變得簡單起來,甚至想不到還有什麼方式可以更加的簡化,而c 3.0中的lamdba則給了我們答案。lamdba的行為實際上和匿名方法是一致的,可以簡單粗暴的理解為是匿名方法的進化版本,和匿名方法作用一致,但書寫起來更加簡單,lamdba表示式有特別的轉換規則,表示式並...

表示式樹的建立與輸出

表示式樹的建立與輸出 編乙個程式,讀入先序遍歷字串,根據此字串建立一棵二叉樹 以指標方式儲存 請注意的是,我們保證該樹一定是表示式樹 見教材5.2 5.8 例如下面的先序遍歷字串 建立起此二叉樹以後,再按要求輸出二叉樹。輸入輸入由多組測試資料組成。每組資料報含一行字串,即表示式樹的先序遍歷序列,字串...