动态加载和使用类型
http://msdn2.microsoft.com/zh-cn/library/k3a58006(VS.80).aspx
http://blog.csdn.net/zjghd/archive/2006/09/27/1292739.aspx 反射详细
读书笔记之第四章 反射

//通过调用GetEvent和命名事件获得EventInfo对象
EventInfo eventInfo = type.GetEvent("PublicEvent",
BindingFlags.Public | BindingFlags.Instance);
//通过EventInfo对象调用AddEventHander。AddEventHander需要与实例相关联的处理程序对象,并且System.Delegate由符合EventHandler签名的方法地址构成和初始化。
eventInfo.AddEventHandler(instance, new EventHandler(Handler));
//引发事件方法
instance.DoEvent();



1。反射概述

公共语言运行库加载器管理应用程序域。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。

 

 

 

 

程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。反射通常具有以下用途:

 

 

 

 

  • 使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

     

  • 使用 Module 了解如下的类似信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

     

  • 使用 ConstructorInfo 了解如下的类似信息:构造函数的名称、参数、访问修饰符(如 public private)和实现详细信息(如 abstract virtual)等。使用 Type GetConstructors GetConstructor 方法来调用特定的构造函数。

     

  • 使用 MethodInfo 来了解如下的类似信息:方法的名称、返回类型、参数、访问修饰符(如 public private)和实现详细信息(如 abstract virtual)等。使用 Type GetMethods GetMethod 方法来调用特定的方法。

     

  • 使用 FieldInfo 来了解如下的类似信息:字段的名称、访问修饰符(如 public private)和实现详细信息(如 static)等;并获取或设置字段值。

     

  • 使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。

     

  • 使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

     

  • 使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

     

System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时构造类型。

 

 

 

 

反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。

 

 

 

 

反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。

2。动态添加和使用类型

反射提供了由语言编译器(例如 Microsoft Visual Basic .NET JScript)用来实现隐式晚期绑定的基础结构。绑定是查找与唯一指定的类型相对应的声明(即实现)的过程。由于此过程在运行时而不是在编译时发生,所以称作晚期绑定。Visual Basic .NET 允许您在代码中使用隐式的晚期绑定;Visual Basic 编译器将调用一个帮助器方法,该方法使用反射来获取对象类型。传递给帮助器方法的参数有助于在运行时调用正确的方法。这些参数包括:对其调用方法的实例(对象),被调用方法的名称(字符串),以及传递给被调用方法的参数(对象数组)。

 

 

以下示例是动态调用动态链接库中的GetDataSet方法,该方法需要参数string userID

 

 

Assembly assembly;

 

 

Type type;

 

 

string dllPath = @"D:\test\PowerSpace.VCP.Utility.dll";

 

 

try

 

 

{

 

 

     assembly = Assembly.LoadFile(dllPath);

 

 

     type = assembly.GetType("PowerSpace.VCP.Utility.cMyString",true,true);//cMyResult

 

 

}

 

 

catch(FileNotFoundException)

 

 

{

 

 

Response.Write("Could not load Assembly: \""+ dllPath +"\"");

 

 

     Return null;

 

 

}

 

 

catch(TypeLoadException)

 

 

{

 

 

Response.Write("Could not load Type: \"string\" \n from assembly: \"" + dllPath + "\""); return null;

 

 

}

 

 

MethodInfo method = type.GetMethod("TestInvoke");

 

 

object obj = Assembly.GetAssembly(type).CreateInstance("PowerSpace.VCP.Utility.GetDataSet");

 

 

 

 

object s = method.Invoke(obj,new object[]{"jiangli"});

 

 

DataSet ss = (DataSet)s;

 

 

assembly = null;

 

 

type = null;

 

 

method =null;

 

 

return ss;

 

 

 

 

3. 访问自定义属性

       访问自定义属性和动态添加和使用类型一样.