什么是反射、反射可以做些什么

什么是反射,反射能干嘛?

反射是:指程序可以访问、检测和修改它本身状态或行为的一种能力
反射是一种能力,所以给的定义就是说明了它能干嘛。

我们平时用反射主要做:

  • 获取类型的相关信息
  • 动态调用方法
  • 动态构造对象
  • 从程序集中获得类型。

获取类型的相关信息

反射的核心Type类,Type对象提供的属性和方法可以获取对象的一切信息,如:方法、字段、属性、事件…等等。

我们获取已加载程序集中类型的Type对象的几种方法:(以StringBuilder 类型为例)

  1. 直接使用typeof操作符 Type T1 = typeof(StringBuilder);
  2. 通过类型实例 Type T2 = new StringBuilder().GetType();
  3. 通过Type类的静态方法 Type T3 = Type.GetType(“System.IO.Stream”);

不管使用那种,我们最终得到的结果都是一样的。

那么我们通过Type又能得到些什么信息呢?

获取类型本身信息(命名空间名、全名、是否是抽象、是否是类、、、等等)

获取类型成员信息(通过Tyep中的方法GetMembers)

MemberType所能包含的成员类型有哪些呢?如:(可以自己可以F12进去看看)

注意:其中MemberInfo的属性DeclaringType返回的是这个属性定义的类型,而ReflectedType返回的是获取这个属性的对象类型。

如:

T2中的Equals,我们知道这个方式是在Objec中定义的,在TClass中调用的,所以:

我们发现获取Type对象的成员大多都是以 isxxx、Getxxx、Getxxxs格式的。

isxxx格式的基本上都是判断是否是某类型。

Getxxx和Getxxxs都是放回某类型和某类型集合。其中主要的类型有:

它们都在 System.Reflection 命名空间下,其每个isxxx、Getxxx、Getxxxs的细节实例用法就不一一演示了。和上面的GetMembers用法区别不大。

动态调用方法

首先定义个类:

调用方式一(使用InvokeMember调用方法)

调用带参实例方法fun

调用无参实例方法fun2

调用静态方法

我们发现了一个问题当我们调用实例方法的时候需要传实例对象过去。(有人会说,都实例对象了,我还要你动态掉调用个屁啊。有种情况,在我们实例了对象后,仍不确定应该调用那个方法时可以只有使用。然后有人有说了,那如果实例对象我也不确定呢?那我们下面会分析连实例对象也给动态了。那接着完下看吧。)

我们来说下这几个参数的意思吧。

第一个:要被动态调用的方法名。

第二个:是一个枚举,表示是调用一个方法

第三个:是Binder,传的是null,使用默认值。

第四个:传如实例对象(调用实例方法时)或者Type对象(调用静态方法时)。

第五个:要传给被调用发的参数数组。

调用方式二(使用MethodInfo.Invoke调用方法)

使用其实和上面的方式一区别不大。

真正的全动态调用

上面的两种方式,在编写代码的时候总是要先确定了已知的对象名和方法名。那么我们在不知道对象和方法名的时候是否也可以调用呢?答案是肯定的,实现如下:

当然,这个代码只能只是fun2,因为上面的传参写死了。(你也可以自己稍微修改下,就可以执行fun、fun2、fun3了)

效果如下:(对象名和方法名都是手动输入的)

动态构造对象

我们先定义一个对象:

动态构造对象

执行效果图:

获取和修改属性

从程序集中获得类型

取得当前代码所在程序集(使用GetExecutingAssembly)

通过反射加载程序集并创建程序中的类型对象

从程序集中获得类型,这个应该是我们平时用得比较多。如我们所谓的依赖注入和控制反转(这个主题将在下篇博文进行分析)就用到了通过反射从程序集中获取类型。

首先我们还是看看怎么从程序集中获得类型吧。我们可以使用Assembly类型提供的静态方法LoadFrom()或Load(),如:

区别:

这样带来的功能是非常强大的。如 我们在没有引用程序集的情况下,也可以使用到程序外的程序集。我们还可以根据不同情况引用不同的程序集。我们甚至还可以通过配置文件来直接配置代码运行时应该加载哪个dll,运行哪个dll中的哪个实现方法。(下篇在讲依赖注入的时候会讲到,同学们继续关注哦~)

从上所知,反射不是某一个概率,而是一类操作的统称。或者说是某些能力的统称。 感觉不好回答反射到底是什么,只能说反射能干什么。它能动态创建对象、动态调用对象方法、动态读取和设置属性和字段、它能动态加载程序外的dll。总的感觉就是大多数都是跟“动态”扯上了关系。

1 5 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部