//定义方法名,返回类型,输入类型
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就能够帮你动态建立代理类,实现切面编程编译