Emit学习-基础篇-基本概念介绍2011-09-03 博客园 yingql之前的Hello World例子应该已经让我们对Emit有了一个模糊的了解,那么 Emit到底是什么样一个东西,他又能实现些什么功能呢?昨天查了点资料,大致 总结了下,由于才开始学习肯定有不完善的地方,希望大家能够批评指正。1.什么是反射发出(Reflection Emit)Emit应该是属于反射中的一个比较高级的功能,说到反射大家应该都不陌生, 反射是在运行时发现对象的相关信息,并且执行这些对象(创建对象实例,执行 对象上的方法)。这个功能是由.NET的System.Reflection命名空间的类所提供的 。简单的说,它们不仅允许你浏览一个程序集暴露的类、方法、属性和字段,而 且还允许你创建一个类型的实例以及执行这些类型上的方法(调用成员)。这些 特性对于在运行时对象发现,已经很了不起了,但.NET的反射机制并没有到此结 束。反射还允许你在运行时构建一个程序集,并且可以创建全新的类型。这就是 反射发出(reflection emit)。使用Emit可以从零开始,动态的构造程序集和类型,在需要时动态的生成代码 ,提高程序的灵活性。有了这些功能,我们可以用其来实现一些典型的应用,如 :l 动态代理(AOP);l 减少反射的性能损失(Dynamic Method等);l ORM的实现;l 工具及IDE插件的开发;l 公共代码安全模块的开发。2.使用Emit的完整流程使用Emit一般包括以下步骤:1)创建一个新的程序集(可以选择存在与内存中或者持久化到硬盘);2)在程序集内创建一个模块;3)在模块内创建动态类;4)给动态类添加动态方法、属性、事件,等;5)生成相关的IL代码;6)返回创建出来的类型或持久化到硬盘中。当然如果你只是想要创建一个Dynamic Method 那么可以直接使用之前 HelloWorld例子中使用的DynamicMethod类来创建一个动态方法,并在构造函数时 传入它所依附的类或者模块。看了这个流程,相信大家已经对用使用Emit来创建 动态类型的过程有了一个直观的认识,下面我们就通过实现一个求斐波那契数列 的类来加深对这一流程的了解。