您现在的位置是:首页 > .NET相关网站首页

.NET 反射的简单使用

简介 .NET 反射的简单使用

反射概述

什么是反射

反射(Reflection)是.NET中的一门重要技术通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。

然后可以通过获取到的成员信息,执行一系列的后续操作,如查看成员的属性信息、查看特性信息、创建对象等。

反射的主要作用有以下:

  • 在运行时查看特性(属性)信息。
  • 审查集合中的各种类型,以及实例化这些类型。
  • 允许延迟绑定的方法和属性(property)。
  • 可以在运行时创建新的类型,然后使用这些类型执行一些任务。

实际上,反射最常用最关键的技术无非是以下四种:

  1. 从程序集中获取任意类
  2. 创建任意类的实例对象。
  3. 获取或验证对象的信息,包括属性、方法等
  4. 调用方法

下面会通过几个实例,依次了解这几种技术的使用方法。但在此之前,我们先了解下反射基本的使用方法

反射使用须知

反射是通过System.Type类获取某个类型的具体信息的,同时,.NET增加了is、as、typeof运算符协助判定对象类型。

is运算符:

is运算符能够判断对象是否为某一类型、或某一类型的子类型。举例如下:

//实例化一个对象

ClassA a=new ClassA();
bool b= a is ClassA;//b=true。因为对象a是ClassA类实例化对象
bool c= a is object;//c=true。因为object是所有类的顶级。

as运算符:

as运算符会执行类型转换,并且在类型转换失败时也不抛出异常,而是返回一个null值。

//实例化一个对象

ClassA a=new ClassA();
ClassB b=new ClassB();
//对象a转换为b类型
ClassB c=a as ClassB;
//若转换失败,c的值为null

typeof运算符:

as、is 能够测试两种类型的兼容性。但要想获得某个类型的具体信息,就需要用typeof。它会返回类型的System.Type对象,通过System.Type对象可以查看到此类型的各种信息,如属性、字段、方法等等。

Type t=typeof(ClassA);
Console.WriteLine(t.FullName);  //FullName返回类型的全称
//可以判断类型是否为class、是否为泛型类等等..
var isClass = t.IsClass;
var isGenericType=t.IsGenericType;

System.Type类

System.Type类是整个反射子系统的核心,这个类中包含了很多属性和方法,使用这些属性和方法可以在运行时得到类型的信息。

下面举出一些常用的属性和方法。

Type类的属性

属性名 作用
FullName 获取指定类型的全名
Assembly 获取指定类型的程序集
Attributes 获取指定类型的特性
Namespace 获取指定类型的命名空间
IsAbstract 判断指定类型是否为抽象类
IsGenericType 判断指定类型是否为泛型类

Type类的方法

方法名 作用
GetProperties() 获取指定类型的属性列表
GetFields() 获取指定类型的全名
GetMethods() 获取指定类型的方法列表
GetMembers() 获取指定类型的成员列表
IsDefined() 判断指定类型是否包含某一特性
IsInstanceOfType() 判断某一对象是否为指定类型的实例

下面我们详细说明下反射的使用方法。

从程序集中获取任意类

上面我说到typeof的用法,使用typeof需要确切地知道类型名,并且类型名是写死的状态,虽然这种方式也很常用,但这并不是反射的全部功能。

我们还可以通过分析程序集的内容,动态地获取程序的可用类型。

反射的类基本上都位于System.Reflection命名空间中,所以我们需要先引用System.Reflection命名空间。

我们可以通过Assembly类加载程序集下的某一类。示例:

var path="";//加载的类的绝对路径,如:"C:\ABC\Test.dll"
//使用LoadFrom方法即可,它在加载类的同时加载类所依赖的程序集。
Assembly ass = Assembly.LoadFrom(path);
//取得所有类型对象
Type[] types=ass.GetTypes();
//取得某一个类型对象
Type type=ass.GetType("");

我们获取到Type对象后,就可以继续后续的一系列操作了。

创建任意类的实例对象

继续上部分内容,获取到Type对象之后,可以根据Type对象创建一个该类型的实例对象。

获取到实例对象后,可以访问该对象的属性,或者执行该对象的方法。代码如下:



文章评论

Top Error:远程服务器返回错误: (403) 已禁止。