.NET基础 (17)反射
2015-09-12 00:16
232 查看
反射
1 请解释反射的基本原理和其实现的基石
2 .NET提供了哪些类型来实现反射
3 如何实现动态地发射程序集
4 如何利用反射来实现工厂模式
反射
1 请解释反射的基本原理和其实现的基石
反射是一种动态分析程序集、模块、类型、字段等目标对象的机制,它的实现依托于元数据。元数据是存储在PE文件中的数据块,它详细记录了程序集后模块内部的结构、引用类型、程序集和清单。
2 .NET提供了哪些类型来实现反射
在System.Reflection命名空间下,.NET提供了丰富的实现反射机制的类型,可以达到读取元数据中所有信息并且动态创建类型对象的功能。
示例:对程序集进行动态分析
首先创建一个程序集
View Code
转载请注明出处:
作者:JesseLZJ
出处:http://jesselzj.cnblogs.com
1 请解释反射的基本原理和其实现的基石
2 .NET提供了哪些类型来实现反射
3 如何实现动态地发射程序集
4 如何利用反射来实现工厂模式
反射
1 请解释反射的基本原理和其实现的基石
反射是一种动态分析程序集、模块、类型、字段等目标对象的机制,它的实现依托于元数据。元数据是存储在PE文件中的数据块,它详细记录了程序集后模块内部的结构、引用类型、程序集和清单。
2 .NET提供了哪些类型来实现反射
在System.Reflection命名空间下,.NET提供了丰富的实现反射机制的类型,可以达到读取元数据中所有信息并且动态创建类型对象的功能。
示例:对程序集进行动态分析
首先创建一个程序集
/// <summary> /// 使用者 /// </summary> class Customer { static void Main(string[] args) { //使用者的代码和传统实现一样 IProduct window = FactoryManager.GetProduct(RoomParts.Window); IProduct pillar = FactoryManager.GetProduct(RoomParts.Pillar); IProduct roof = FactoryManager.GetProduct(RoomParts.Roof); Console.Read(); } } /// <summary> /// 工厂管理类型 /// </summary> class FactoryManager { public static IProduct GetProduct(RoomParts part) { Factory factory = new Factory(); IProduct product = factory.Produce(part); Console.WriteLine("生产了一个产品:" + product.GetName()); return product; } } /// <summary> /// 屋子产品的零件 /// </summary> enum RoomParts { Roof, Window, Pillar } /// <summary> /// 这个特性用来附加在产品类型之上, /// 来标注该类型代码哪个产品,方便反射使用 /// </summary> [AttributeUsage(AttributeTargets.Class)] class ProductAttribute : Attribute { //标注零件的成员 private RoomParts _myRoomPart; public ProductAttribute(RoomParts part) { _myRoomPart = part; } public RoomParts RoomPart { get { return _myRoomPart; } } } /// <summary> /// 这个特性用来附加在产品接口之上 /// 来标注一共实现了多少产品零件,方便反射使用 /// </summary> [AttributeUsage(AttributeTargets.Interface)] class ProductListAttribute : Attribute { private Type[] _myList; public ProductListAttribute(Type[] Products) { _myList = Products; } public Type[] ProductList { get { return _myList; } } } #region 产品类族 /// <summary> /// 产品零件接口, /// 需要添加所有实现该接口的列表 /// </summary> [ProductList(new Type[]{ typeof(Roof), typeof(Window), typeof(Pillar)})] interface IProduct { String GetName(); } /// <summary> /// 屋顶类型 /// </summary> [Product(RoomParts.Roof)] class Roof : IProduct { public String GetName() { return "屋顶"; } } /// <summary> /// 窗户类型 /// </summary> [Product(RoomParts.Window)] class Window : IProduct { public String GetName() { return "窗户"; } } /// <summary> /// 柱子类型 /// </summary> [Product(RoomParts.Pillar)] class Pillar : IProduct { public String GetName() { return "柱子"; } } #endregion #region 工厂类 /// <summary> /// 工厂类型,这里不再需要一个类族, /// 而只需要一个工厂类型 /// </summary> class Factory { public IProduct Produce(RoomParts part) { //通过反射,从IProduct 接口中获得属性, //从而获得所有的产品零件列表 ProductListAttribute Attr = (ProductListAttribute) Attribute.GetCustomAttribute(typeof(IProduct), typeof(ProductListAttribute)); //遍历所有的实现产品零件类型 foreach (Type type in Attr.ProductList) { //利用反射查找其属性 ProductAttribute pa = (ProductAttribute) Attribute.GetCustomAttribute( type, typeof(ProductAttribute)); //确定是否是需要的零件 if (pa.RoomPart == part) { //再一次利用反射 //创建产品零件类型 Object product = Assembly.GetExecutingAssembly(). CreateInstance(type.FullName); return product as IProduct; } } //不应该到达这里 return null; } } #endregion
View Code
转载请注明出处:
作者:JesseLZJ
出处:http://jesselzj.cnblogs.com
相关文章推荐
- PHP [面试秘籍] 程序员经典面试回答,怎样回答面试官的问题
- mysql设置外部ip访问
- ZOJ 3547 The Boss on Mars(容斥)
- yii 1 安装教程
- 这周的《财经郎眼 - 股市到底了吗》非常不错
- myecplice和ecplice远程调试
- Leetcode 227 Basic Calculator II
- html5+css3项目 (企业网站之标题)
- 81. Search in Rotated Sorted Array I II
- [leetcode] 187 Repeated DNA Sequences
- Phalcon Framework的Mvc结构及启动流程(部分源码分析)
- 【求割边】
- 交换排序
- HDU 4407 Sum(容斥)
- Tomcat安装、配置、优化及负载均衡详解
- EditText的drawableleft跟随其Gravity
- 活用maven使web.xml可以用maven变量
- 行列式的理解
- POJ 2773 Happy 2006(二分+容斥)
- Hadoop-eclipse-plugin插件安装