【反射】教你在十分钟内学会反射
反射,提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。其实反射很简单的,理解了调用的过程再自己动手做几个实例基本上就能熟悉了。
对于反射,我们需要准备好一个类库,编译出DLL文件,然后通过System.Reflection命名空间下的 Assembly类来加载这个程序集:
Assembly asb = Assembly.LoadFrom(@"D:\project\Calculate\Calculate\bin\Debug\Calculate.dll");
说到加载程序集,有两种方法Assembly.LoadFrom和Assembly.Load,前者是需要一个绝对路径;后者是需要程序集名就可以了,但是必须在程序启动时这个程序集会随着程序启动而加载。
调用反射的流程:
首先获得一个程序集,你是不知道里面有什么类,类的构造什么,具体类里面有什么方法、属性和字段等。所以必须先获得关于类的信息,然后写成一个文档以便于后面开发使用。
加载好程序集后可以使用GetTypes()来获取类名:
我们可以通过遍历来获类名和属于该类下的方法等:
1 Type[] type = asb.GetTypes();
2 foreach (Type item in type)
3 {
4
5 for (int i = 0; i <item.GetMethods().Length-1; i++)
6 {
7 listView1.Items.Add(item.ToString());
8 listView1.Items[i].SubItems.Add(item.GetMethods()[i].ToString());
9 }
既然我们知道了程序集里面的类以及类的信息,当然包括了方法的返回值类型以及需要传入的参数,调用方法也就简单了,有两种方法:
一:
1.先实例化一个Type来获取调用类的类型,这样就获取到了类的类型了。
2.调用一个类里的方法,必须先实例化一个类的对象利用Activator.CreateInstance(Type type);来创建实例化对象
3.这下就可以调用方法了。MethodInfo mi = t.GetMethod(Function name)传入需要调用的方法名
4.最后就是执行方法了, mi.Invoke(obj, Object Object[]);
二:
1和2都是同上;
3.通过类型来调用方法 t.InvokeMember(Function name,BindingFlags.InvokeMethod, null, obj, null),当然里面需要传的参数不懂的话可以一个个查的。
反射虽然是一个很不错的技术,但是不要以为它深不可测,其实真正学起来是很简单的。理解流程以及调用的过程基本上就可以把它拿下了。个人认为此节内容是比较通俗易懂的,
基本上就是这样的模版,设计到一些细节的问题大家可以多多debug下,好多属性和方法可以在debug下很清晰的看到。好的程序员应该有能力在debug下学到更多东西,我就经常在debug下一个一个的观察,例举各种情况来发现不同点和易错点。
喜欢我的话,就果断关注我吧。附上两份源码:
一:自己写的类库http://files.cnblogs.com/Zeech-Lee/Calculate.rar,二:反射的使用。http://files.cnblogs.com/Zeech-Lee/%E5%8F%8D%E5%B0%84.rar
作者: Zeech_Lee 发表于 2011-10-18 18:11 原文链接
最新新闻:
· RIM发布BBX移动平台:整合黑莓和QNX系统(2011-10-19 08:29)
· 盛大在线调整收官:新管理层成型 裁员未超5%(2011-10-19 08:28)
· 雅虎第三季度净利润2.93亿美元同比下滑26%(2011-10-19 08:27)
· 苹果员工今天悼念乔布斯 零售店将停业数小时(2011-10-19 08:26)
· 三星苹果专利战全面开打:禁售令申请扩至亚太(2011-10-19 08:25)