Microsoft.Net框架程序设计学习笔记(39):反射
时间:2011-04-01 来源:辛勤的代码工
先绑定类型,然后调用方法的方式通常称为晚绑定。而早绑定指一个应用程序使用的类型和方法在编译时就已确定。
System.Reflection.Assembly类型提供了三个静态方法允许我们显式加裁一个程序集:Load(通过接受一个程序集标识来加载程序集,可加载弱程序集和强程序集)、LoadFrom(通过接受一个程序集文件完整路径名称加载程序集,仅能加载弱程序集)、LoadWithPartialName。我们应该尽可能使用Load方法,避免使用LoadFrom、LoadWithPartialName。
System.AppDomain也提供一个Load方法,该方法是一个实例方法,允许我们将一个程序集加载到一个特定的应用程序中。该方法返回一个程序集引用。
CLR支持卸载应用程序域。卸载应用程序域会导致包含在其中的所有程序集都被卸载。我们只需调用AppDomain的静态方法Unload,并为其传递希望卸载的AppDomain对象引用即可。
以中立域形式加载的程序集不可能从一个应用程序域中被卸载。
System.Type类型是一个抽象类,FCL中提供了几个继承自System.Type的类型:System.RuntimeType和System.Reflection.TypeDelegator,以及定义在System.Reflection.Emit命名空间中的EnumBuilder和TypeBuilder。
RuntimeType是一个FCL内部的类型,我们在.Net框架文档中看不到它。当应用程序域中的类型第一次被访问时,CLR会构造一个RuntimeType的实例,并初始化该实例的字段来反射类型的信息。
调用System.Object.GetType()方法时,CLR会判断指定对象的类型,并返回一个指向它的RuntimeType对象的引用。
由于应用程序域中的每个类型都只有一个对应的RuntimeType对象,我们可以使用判等和判异操作符来比较两个对象的类型是否相同。
System.Type提供GetType方法返回一个RuntimeType对象的引用。该方法接受一个String类型参数,该参数必须是类型的完整名称(包括命名空间),编译器认为的基元类型名称(如C#中的int、string、bool等)是不被接受的,应使用System.Int32、System.String、System.Boolean来代替。我们也可为GetType方法传递一个限定程序集的类型字符串(如System.Int32,mscorlib,Version=xxx,Cultrue=xxx,PublicKey-Token=xxx),这种情况下,GetType会到指定的程序集中查找类型。
System.Reflection.Assembly类型提供有以下三个实例方法获取类型对象:GetType、GetTypes、GetExportedTypes。
System.Reflection.Module类型提供以下三个实例方法获取类型对象:GetType、GetTypes、FindTypes。
C#中允许使用typeof操作符直接获取一个对象的类型。