反射概述
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集,模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,而可以调用类型的方法或访问其字段和属性。反射通常具有以下用途
使用Assembly定义和加载程序集,加载在程序集清单中列出的模块,以及从该程序集中查找类型并创建改类型的实例。
使用Module了解如下的类似信息:包含模块的程序集以及模块中的类等。还可以获取在模块上定义的所有全局方法或其他特定的非全局方法
使用ConsructorInfo了解如下的类似信息:构造函数的名称,参数,访问修饰符和实现的详细信息(如abstract或virtual)等。
使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数
使用Methodinfo来了解如下的类似信息:方法的名称,返回类型,参数,访问修饰符,和实现详细信息。使用Type的GetMethods或 GetMethod方法来调用特定的方法
使用 FieldInfo 来了解如下的类似信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。
使用EventInfo 来了解如下的类似信息,事件的名称,事件处理程序数据类型,自定义属性,声明类型或反射类型等:并添加或移除时间处理程序
使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。
使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。
System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时构造类型。
反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。
反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。
反射实现简单工厂模式
1、定义接口
public interface IPBOExplorerHandler
2、实现接口
public class DOCExplorerHandler : IPBOExplorerHandler
public class CHGExplorerHandler : IPBOExplorerHandler
public class PARTExplorerHandler : IPBOExplorerHandler
public class REQExplorerHandler : IPBOExplorerHandler
3、反射实现
public static IPBOExplorerHandler CreateIPBO(string strHandlerName)
{
string strAssembly = Application.StartupPath + "//ZTE.PDM.PART.WinUI.dll";
string strTypeName = "ZTE.PDM.PART.WinUI." + strHandlerName;
object obj = Activator.CreateInstance(Assembly.LoadFrom(strAssembly).GetType(strTypeName));
IPBOExplorerHandler myHandler = obj as IPBOExplorerHandler;
return myHandler;
}
4、简单工厂
public static IPBOExplorerHandler MakeIPBO(string strHandlerName)
{
IPBOExplorerHandler myHandler;
switch(strHandlerName)
{
case "DOC" : myHandler = new DOCExplorerHandler(); break;
case "CHG" : myHandler = new CHGExplorerHandler(); break;
case "PART" :myHandler = new PARTExplorerHandler();break;
case "REQ" : myHandler = new REQExplorerHandler(); break;
default: myHandler = new DOCExplorerHandler();break;
}
return myHandler;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/nileel/archive/2007/04/17/1567589.aspx