AssemblyBuilder和Activator两个类是DispatchProxy类实现动态代理以及AOP的根本,示例demo可参考 DispatchProxy实现动态代理及AOP 。AssemblyBuilder的命名空间是System.Reflection.Emit,没错就是你听过的Emit。那么它是干什么用的?先看看 官方 的示例代码:

// ↓ AssemblyBuilder构造自定义类
AssemblyName aName = new AssemblyName("DynamicAssemblyExample");
AssemblyBuilder ab =AssemblyBuilder.DefineDynamicAssembly(aName,AssemblyBuilderAccess.Run);ModuleBuilder mb =ab.DefineDynamicModule(aName.Name);TypeBuilder tb = mb.DefineType("MyDynamicType",TypeAttributes.Public);FieldBuilder fbNumber = tb.DefineField("m_number",typeof(int),FieldAttributes.Private);Type[] parameterTypes = { typeof(int) };
ConstructorBuilder ctor1 = tb.DefineConstructor(MethodAttributes.Public,CallingConventions.Standard,parameterTypes);ILGenerator ctor1IL = ctor1.GetILGenerator();
ctor1IL.Emit(OpCodes.Ldarg_0);
ctor1IL.Emit(OpCodes.Call,typeof(object).GetConstructor(Type.EmptyTypes));
ctor1IL.Emit(OpCodes.Ldarg_0);
ctor1IL.Emit(OpCodes.Ldarg_1);
ctor1IL.Emit(OpCodes.Stfld, fbNumber);
ctor1IL.Emit(OpCodes.Ret);ConstructorBuilder ctor0 = tb.DefineConstructor(MethodAttributes.Public,CallingConventions.Standard,Type.EmptyTypes);ILGenerator ctor0IL = ctor0.GetILGenerator();
ctor0IL.Emit(OpCodes.Ldarg_0);
ctor0IL.Emit(OpCodes.Ldc_I4_S, 42);
ctor0IL.Emit(OpCodes.Call, ctor1);
ctor0IL.Emit(OpCodes.Ret);PropertyBuilder pbNumber = tb.DefineProperty("Number",PropertyAttributes.HasDefault,typeof(int),null);MethodAttributes getSetAttr = MethodAttributes.Public |MethodAttributes.SpecialName | MethodAttributes.HideBySig;MethodBuilder mbNumberGetAccessor = tb.DefineMethod("get_Number",getSetAttr,typeof(int),Type.EmptyTypes);ILGenerator numberGetIL = mbNumberGetAccessor.GetILGenerator();
numberGetIL.Emit(OpCodes.Ldarg_0);
numberGetIL.Emit(OpCodes.Ldfld, fbNumber);
numberGetIL.Emit(OpCodes.Ret);MethodBuilder mbNumberSetAccessor = tb.DefineMethod("set_Number",getSetAttr,null,new Type[] { typeof(int) });ILGenerator numberSetIL = mbNumberSetAccessor.GetILGenerator();
numberSetIL.Emit(OpCodes.Ldarg_0);
numberSetIL.Emit(OpCodes.Ldarg_1);
numberSetIL.Emit(OpCodes.Stfld, fbNumber);
numberSetIL.Emit(OpCodes.Ret);pbNumber.SetGetMethod(mbNumberGetAccessor);
pbNumber.SetSetMethod(mbNumberSetAccessor);MethodBuilder meth = tb.DefineMethod("MyMethod",MethodAttributes.Public,typeof(int),new Type[] { typeof(int) });ILGenerator methIL = meth.GetILGenerator();
methIL.Emit(OpCodes.Ldarg_0);
methIL.Emit(OpCodes.Ldfld, fbNumber);
methIL.Emit(OpCodes.Ldarg_1);
methIL.Emit(OpCodes.Mul);
methIL.Emit(OpCodes.Ret);Type t = tb.CreateType();//↑ AssemblyBuilder类代码
MethodInfo mi = t.GetMethod("MyMethod");
PropertyInfo pi = t.GetProperty("Number");//↓ Activator调用自定义的类
object o1 = Activator.CreateInstance(t);Console.WriteLine("o1.Number: {0}", pi.GetValue(o1, null));
pi.SetValue(o1, 127, null);
Console.WriteLine("o1.Number: {0}", pi.GetValue(o1, null));object[] arguments = { 22 };
Console.WriteLine("o1.MyMethod(22): {0}",mi.Invoke(o1, arguments));object o2 = Activator.CreateInstance(t,new object[] { 5280 });
Console.WriteLine("o2.Number: {0}", pi.GetValue(o2, null));
// ↑Activator 类代码
Console.Read();

先看看输出结果吧:

我猜您看的迷糊吧,这都啥玩意,不急。对AssemblyBuilder以及Activator的概念是:动态创建类型。上面的代码中的AssemblyBuilder相关代码是动态的构造一个完整的类型,包括了类的行为(方法)、状态(字段、属性),构造函数等。相当于就是一个类型的定义:

public class MyDynamicType
{private int m_number;public MyDynamicType() : this(42) {}public MyDynamicType(int initNumber){m_number = initNumber;}public int Number{get { return m_number; }set { m_number = value; }}public int MyMethod(int multiplier){return m_number * multiplier;}
}

这就是AssemblyBuilder类的作用了,那么Activator类的作用呢?其实你也应该猜到了,就是一个实例化类型及调用对象的过程。
AssemblyBuidler类 + Activator类 两者的结合可以实现动态代理以及AOP,功能及其强大,园子里蒋老大的Dora AOP框架的代码中也有这两个类。

转载于:https://www.cnblogs.com/zhiyong-ITNote/p/11060261.html

AssemblyBuilder以及Activator双剑合璧相关推荐

  1. vim 双剑合璧,天下无敌(笔记)

    技巧 12:双剑合璧,天下无敌 参考:Vim 实用技巧 - Practical Vim 操作符 + 动作命令 = 操作 d{motion}命令可以对一个字符(dl),一个完整单词(daw),一个段落( ...

  2. IDA+OD双剑合璧=逆向无敌

    标 题: [原创]IDA+OD双剑合璧=逆向无敌 作 者: Tennn 时 间: 2015-12-12,22:25:19 链 接: http://bbs.pediy.com/showthread.ph ...

  3. MarkDown、Vim双剑合璧

    作为一名软件攻城狮(是的,我从来都以攻城狮自居! 我坚信如今的每一天,都在朝攻城狮迈进.虽然被菜鸟的肉身皮囊裹着,我依然还是怀着攻城狮的内心! 我非常讨厌别人喊我程序猿.虽然这是不争的事实!).... ...

  4. 蚂蚁金服与阿里云“双剑合璧”,加速释放金融科技时代新红利

    作为一个参加了N届云栖大会的老司机,前段时间在收到2019云栖大会的邀请后,马上就去阿里云官网"溜达"一下,看看是不是会有"剧透".不出所料,竟然发现蚂蚁金服的 ...

  5. Spring Cloud Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    文章目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashbo ...

  6. OpenCL专题04:ViennaCL与Eigen双剑合璧

    前言 大家都爱用Python,很大程度是因为Python有非常丰富好用的扩展包,比如Numpy.Matplotlib.Pandas等.特别是Numpy,为科学计算提供了基础支撑,使得Python具有类 ...

  7. Kafka和Flink双剑合璧,Confluent收购Immerok引起业内广泛讨论

    2023年开年开源界就出了一个大新闻,1月6日Kafka的商业化公司Confluent创始人宣布签署了收购 Immerok 的最终协议,而Immerok是一家为 Apache Flink 提供完全托管 ...

  8. 揭秘udesk智能质检:质检+分析双剑合璧

    质检是什么 随着市场的成熟与规范,客户都越来越理性.一单完成之后仅仅是服务的开始,重视客户后续体验感才能够保证服务长久.只有跟客户注重服务细节,保持信任才能成为朋友,才能有长远的收益.越来越多的企业需 ...

  9. 双剑合璧保障数据库安全

    烽火台已经和大家接触了有段日子了,相信通过前面十几台的介绍,大家已经对它的功能.特点有了比较深的了解.今天的主题是数据库安全,借着这个机会给大家介绍下我们的烽火台和锐御WAF如何双剑合璧来保障数据库安 ...

最新文章

  1. 张苗 清华大学 计算机,2011222229张苗组件局域网及搭建服务器技术分析.doc
  2. rdd数据存内存 数据量_「大数据」(七十七) Spark之IO机制
  3. 《COM原理与应用》学习笔记二——COM对象和COM接口的实现
  4. java 工厂模式详解_java 工厂模式的实例详解
  5. 拼装sql_2020最新最全面的SQL优化干货总结
  6. android驱动在win10系统上安装的心酸历程
  7. Explicit 关键字和各种类型转换(转)
  8. JS高级程序设计——阅读笔记一
  9. 自动化框架到底是什么?
  10. bilibili怎么用用户名登录_b站账号(bilibili免费账号密码)
  11. 数据库设计3个泛式和经验谈
  12. 淘宝网店装修代码使用方法大全
  13. 一封高三班主任写给大学生的信 早看的话大学就不会那么堕落
  14. 全国青少年编程等级考试python一级真题2021年3月(含题库答题软件账号)
  15. c++ bind函数
  16. Web前端期末大作业-重庆旅游景区网页设计(HTML+CSS+JS)
  17. 混合模式:mix-blend-mode: difference
  18. 为什么是 import cv2呢
  19. show tables like 不能取别名的解决方法
  20. 解决ADS(AURIX Development Studio)程序下载失败的问题

热门文章

  1. 三星android one 拍照功能,三星One UI 3.1体验:更好用了,也更注重隐私了
  2. 魔兽世界官方小说android,魔兽世界官方小说(套装共6册)
  3. TexturePacker导入unity后图片还是显示成整图
  4. 14个坏习惯可能让你丢掉工作
  5. 2020美赛E题解题思路方法:淹溺在塑料中
  6. pinyin4j获取多音字首字母同时保留非中文字符
  7. Docker基础篇 - (六)Docker 网络Spring Boot微服务打包Docker镜像
  8. 2017.08.05
  9. 让Octave支持中文
  10. linux_bash/zsh ls(dircolor)_文件夹背景颜色去除(绿色背景)(fit to wsl)(simple solution)