【反射】教你在十分钟内学会反射

  反射,提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。其实反射很简单的,理解了调用的过程再自己动手做几个实例基本上就能熟悉了。

  对于反射,我们需要准备好一个类库,编译出DLL文件,然后通过System.Reflection命名空间下的 Assembly类来加载这个程序集:

Assembly  asb = Assembly.LoadFrom(@"D:\project\Calculate\Calculate\bin\Debug\Calculate.dll");

说到加载程序集,有两种方法Assembly.LoadFrom和Assembly.Load,前者是需要一个绝对路径;后者是需要程序集名就可以了,但是必须在程序启动时这个程序集会随着程序启动而加载。

调用反射的流程:

首先获得一个程序集,你是不知道里面有什么类,类的构造什么,具体类里面有什么方法、属性和字段等。所以必须先获得关于类的信息,然后写成一个文档以便于后面开发使用。

加载好程序集后可以使用GetTypes()来获取类名:

我们可以通过遍历来获类名和属于该类下的方法等:

View Code
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下一个一个的观察,例举各种情况来发现不同点和易错点。

  喜欢我的话,就果断关注我吧。附上两份源码:

一:自己写的类库https://files.cnblogs.com/Zeech-Lee/Calculate.rar,二:反射的使用。https://files.cnblogs.com/Zeech-Lee/%E5%8F%8D%E5%B0%84.rar

posted on 2011-10-18 18:11  Zeech_Lee  阅读(3858)  评论(11编辑  收藏  举报

导航