用Emit技術替代反射

2021-09-19 22:02:15 字數 1193 閱讀 2200

system.reflection.emit命名空間類可用於動態發出microsoft中間語言(msil)**,以便生成的**可以直接執行。反射也用於獲取有關類及其成員的資訊。換句話說,反射是一種技術,允許您檢查描述型別及其成員的元資料,你可能以程式設計方式訪問過元件物件模型型別庫, .net中的反射非常相似,但功能強大且易於使用。使用.net編譯器編譯原始檔時,編譯器會產生原始檔中語句中的msil**以及描述檔案中定義的型別的元資料。正是這個元資料,.net中的反射api使你能夠檢查。在這個system.reflection命名空間中,有一些類可用於幫助訪問程式中固有的結構,比如類、型別、字段、結構、列舉、成員和方法。例如,您使用type類來標識所反映的類的型別,fieldinfo類表示結構或列舉的字段。memberinfo類表示反射類的成員,並使用methodinfo類表示反射類的方法。primerealfipe類表示反射類中的方法的引數。

使用system.reflection.emit命名空間類在可以編譯時建立**,但前提是必須懂il**。(本文不做il**詳解,因為我也不會。。。)事實上,你實際編寫的是就是幕後的msil本身。你可以使用反射在記憶體中定義程式集,為該程式集建立類/模組,然後為該模組建立其他模組成員和新型別。你同樣也可以使用emit來構造程式集。reflection.emit是乙個強大的命名空間,我們可以在執行時動態地發出瞬態和持久化程式集。reflection.emit產生乙個低階,語言中立的msil。通常,我們通過將源**儲存到磁碟然後編譯該源**來建立程式集,然後我們呼叫我們需要從該程式集中使用的類的方法,該程式集是在磁碟上編譯的。但是你可以想象,這涉及額外的磁碟寫入和讀取工作!使用反射生成**,我們可以省略此開銷並立即將操作**直接傳送到記憶體中。反射發射只不過是直接在**中編寫任何彙編**,然後即時呼叫生成的**。這也並不是說反射效率就是高,因為在執行期產生指令也是需要時間,各有優缺點。

system.reflection.emit命名空間提供使用者動態建立.exe檔案所需的類。它的類允許編譯器或工具發出元資料和msil。因此,您可以動態地在磁碟上建立.exe檔案,就像執行**,儲存**並呼叫編譯器來編譯**一樣。大多數情況下,您需要此功能和此命名空間用於自定義指令碼引擎和編譯器。

reflection.emit命名空間有許多可用於重要的的類。以下是兩個最重要的:

assemblybuilder類是在執行時發出**並具有建立動態模組的方法的任何應用程式的起點。

modulebuilder類用作在執行時向動態程式集新增類和結構等型別的起點。

反射的Emit實現 2

考慮了一下,將字段實現給貼了出來,但是說實話,我琢磨不定哪乙個是最佳方案 原因如下 public class user set internal int?id public int?id set 也就是說,字段必須是internal屬性。囧 public class fieldproperty t ...

System Reflection 反射技術例項

專案結構 reflectionexample.csproj helloworld.cs program.cs 源 helloworld.cs using system using system.collections.generic using system.text namespace refle...

反射技術繼續

假設另乙個工程中的所有類都編譯到乙個dll檔案中了,在這很多的類當中,有乙個類叫stringutil,命名空間在hsmp.commonbasic.common下 該類中有乙個方法 public double getsum double x,double y 編譯後dll檔案的存放路徑是 d test...