反射(初级篇)

 

反射机制也可以称为是一种晚绑定

 

其实说白就是在编写代码的时候,程序员可能还不知道或者不能确定程序运行时要调用哪一段代码,于是只能把决定权交给代码,所以在利用反射的同时,大部分都会加上接口一起使用。比如我们公司的WinService项目就是用反射和接口实现,那样做的好处就是:使用者无需了解里面是如何实现,如何实例化对像的。只要继承特定的接口,实现接口中的方法就会自动给调用,也许这样说大家只知道了一个大概,致于怎么用,在哪用还不是很清楚。下面我写一个例子吧!

 

 

使用反射机制调用方法的四步曲:

1 加载程序集

2 获取类的类型

3 创建该类的实例

4 调用该实例的方法

 

 

 

使用反射之前,大家可以去MSDN先了解一下Assembly ,这个类的主要功能是帮用户实例化对象(这是我个人了解,或者他有更多的功能)

 

我刚刚说了使用反射的时候大多都会加上接口一起用,那我们先定义一个接口

//接口IName

pubce InterFace IName

{

  void Test();

}

 

我们需要写一个类来继承上面我们定义的IName接口

 

public class Red : IName

{

       void Test()

       {

               //在这里可以写你的业务逻辑..

              Console.WriteLine("Red");

       }

}

 

我们想要动态实例化对象就需要刚刚上面我们所说的Assembly类命名空间,他所在的命名空间是

using System.Reflection

 

 

在Mail方法里面演示如何动态实例化对象

因为这个类大部分方法都是静态的,目前我们使用到的功能就直接用类名点方法名就行了!不用实例化

public static void Mail(string[] args)

{

    Assembly sm =AssemBly.load(str);   //str变量是字符串类型,你要加载的程序集(查看程序集,选中项目,右键属性) 

   //再用上面我们所得到的sm对象获取类实例

   Iname name= sm.CreateInstance (str2) as IName; //str2也是字符串,是类所在的命名空间加上类名(在这里严格区别大小写)

}

 

 

上面的CreateInsetance()方法返回的是一个object类型,我们可以用相对应的类来接收他,不过这样就看不到灵活性和扩展性了,接口的好处就在这里体现出来了,在这里我们就可以利用接口来调用接口里面所定义的方法,无论你是哪个类只要你继承了IName这个接口,实现了他的方法(注意CreateInstance返回的是Object类型,所以在这里要转换成接口类型)

as转换如果失败的话。则返回null

如果用强转换 (IName)sm.CreateInstance (String str)失败的话。则会抛出异常;

 

当然,在使用反射之前你必须知道类所在的程序集与他的命名空间,例如我公司的项目就是把这两个信息存放在web.Config配置文件中,然后程序在从配置文件中读出相对应的value,这样就变成无需要修改源代码,可以把这个项目给做成dll,如无意外,以后都不需要专人维护与修改。

 

  

像上面我所写的代码就是一个利用工厂模式完成的,这是以前在一本书上看过的。

  

反射机制的优点:

1.       它提供了一种手段,将指定具体类推迟到了运行时刻。

2.       它可以让程序设计出更具有灵活性和扩展性的代码。

反射机制缺点:

1.       其最大的缺点就是编译器无法对对象进行类型检查,此时IDE的智能感知将无能为力。(我个人认为这也是他的优点,增强他的灵活性)

2.       想使用反射机制我们要在原先的基础上编写更多的代码

3.       花费大量的系统资源,所以反射虽然好用,但也要有选择性的用。

 

以上是我最近几天用反射的一些体会心得,所以有什么讲得不对的地方请大家提出来;

 

以后有时间我的一些学习心得在这里和大家分享的, 这是第一篇:)

 

 

posted on 2008-08-30 18:58  Ss_Andy  阅读(553)  评论(6编辑  收藏  举报