//定義方法名,返回類型,輸入類型
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就能夠幫你動態建立代理類,實現切面編程編譯