在上一篇文章中,老周厚著臉皮給大伙介紹了代碼文檔的基本結(jié)構(gòu),以及一些代碼對象與CodeDom類型的對應(yīng)關(guān)系。
在評(píng)論中老周看到有朋友提到了 Emit,那老周就順便提一下。嚴(yán)格上說,Emit并不是針對代碼文檔生成和編譯而設(shè)計(jì)的,Emit一方面可以實(shí)時(shí)發(fā)出 IL 指令,另一方面也支持動(dòng)態(tài)程序集,即可以在運(yùn)行時(shí)創(chuàng)建程序集,并可以定義類型,然后可以執(zhí)行。而CodeDom所針對的是代碼文檔的生成和編譯,所以說,是有所不同的。
哦,是了,還有一個(gè)玩意兒挺有趣,也提一下吧——?jiǎng)討B(tài) Linq 表達(dá)式樹。它也跟動(dòng)態(tài)編譯有點(diǎn)像,就是動(dòng)態(tài)創(chuàng)建 LINQ表達(dá)式樹,LINQ懂吧,別告訴你不知道,這是玩.net的必備法寶,表達(dá)式樹創(chuàng)建后會(huì)實(shí)時(shí)編譯為一個(gè)委托實(shí)例,使用時(shí)直接調(diào)用生成的委托實(shí)例即可。
好,下面開始本文的內(nèi)容。先說說表達(dá)式,因?yàn)檎Z句是由表達(dá)式組成的,按照正常人類的思考方式,應(yīng)當(dāng)由小及大來學(xué)習(xí)。啥是表達(dá)式呢,其實(shí)可以說,表達(dá)式是代碼文檔的基礎(chǔ)元素,比如一個(gè)int值 2500,就是一個(gè)表達(dá)式;字符串常量用雙引號(hào)包起來,如"abc",也是一個(gè)表達(dá)式;當(dāng)前類實(shí)例的引用 this也是表達(dá)式;基類實(shí)例的引用 base,也是表達(dá)式;變量名 a 也是表達(dá)式;數(shù)組索引,如 [0] 也是表達(dá)式;方法中的輸出參數(shù) out 也是表達(dá)式……
CodeExpression 是所有表達(dá)式對象的公共基類,從它的派生類來看,咱們不妨對表達(dá)式的類型先來個(gè)非專業(yè)總結(jié),這樣有助于大家掌握思路。這個(gè)類的派生類相當(dāng)多,不要暈,思路理清了,就不怕它數(shù)量多。
老周大致把這些表達(dá)式類劃分以下幾類(僅供參考):
1、創(chuàng)建實(shí)例。如CodeArrayCreateExpression、CodeDelegateCreateExpression等,大家可以根據(jù)它們的名字來猜猜其作用,現(xiàn)在你不必弄明白到底怎么用,后面老周會(huì)教你怎么用的。
2、引用。比如當(dāng)前實(shí)例引用(this)CodeThisReferenceExpression,再比如引用某個(gè)實(shí)例的方法的語句 CodeMethodRefere