反射(初级篇)
反射机制也可以称为是一种晚绑定
其实说白就是在编写代码的时候,程序员可能还不知道或者不能确定程序运行时要调用哪一段代码,于是只能把决定权交给代码,所以在利用反射的同时,大部分都会加上接口一起使用。比如我们公司的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. 花费大量的系统资源,所以反射虽然好用,但也要有选择性的用。
以上是我最近几天用反射的一些体会心得,所以有什么讲得不对的地方请大家提出来;
以后有时间我的一些学习心得在这里和大家分享的, 这是第一篇:)