使用Emit編寫IL代碼

            //定義方法名,返回類型,輸入類型
            var method = new DynamicMethod("SetEmit", null, Type.EmptyTypes);前端

            //生成IL代碼
            var ilGenerator = method.GetILGenerator();
            ilGenerator.Emit(OpCodes.Nop);
            ilGenerator.Emit(OpCodes.Ldstr, "Hello World!");
            //尋找Console的WriteLine方法
            ilGenerator.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
            ilGenerator.Emit(OpCodes.Nop);
            ilGenerator.Emit(OpCodes.Ret);編程

            //建立委託
            var action = method.CreateDelegate(typeof(Action)) as Action;
            action.Invoke();後端

 

編寫的代碼,代碼解釋器會編譯成IL代碼(相似於指令行語言)運行到CLR中執行代理

用處:對象

(1)、動態DTO-當咱們須要將實體映射到某個DTO時,能夠用動態DTO來代替你手寫的DTO,選擇你須要的字段回傳給前端,或者前端把他想要的字段傳給後端string

(2)、DynamicLinq-個人第一篇博文有個讀者提到了表達式樹,而linq使用的正是表達式樹,當表達式樹+Emit時,咱們就能夠用像SQL或者GraphQL那樣的查詢語句實現動態查詢it

(3)、對象合併-咱們能夠編寫實現一個像js當中Object.assign()同樣的方法,實現對兩個實體的合併io

(4)、AOP動態代理-AOP的核心就是代理模式,可是與其對應的是須要手寫代理類,而Emit就能夠幫你動態建立代理類,實現切面編程編譯

相關文章
相關標籤/搜索