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