今天,首次接触反射,感觉微软的这个技术还是不错,下面,我们就一起看看吧!
 反射是编程的读取与类型相关联的元数据的行为。通读取元数据,可以了解它是什么类型以及类型的成员。比如类中的属性,方法,事件等。所属命名空间System.Reflection。说白了,就是读取一个命名空间中的类,然后调用其里面的方法来供我们使用。说到这里,你也许会想了,这不就是***吗?其实不然,这个是微软自己定义的一个类,换句话说,就是我们呢,只能去获得微软自己的东西。
 首先,我们来看一个例子,这个例子,告诉了我们怎样从已经编译好的dll文件中去读取我们想要的方法。
 
 在反射中,有一个Assembly的程序集,它呢,提供了一个LoadFrom的方法,该方法能够获取一个dll的文件。
Assembly SampleAssembly= Assembly.LoadFrom("c:\\abc.dll");
接下来,我们用到了CreateInstance()这个方法,用它呢,我们可以实例化我们需要的一个对象。
object obj = SampleAssembly.CreateInstance("NSDemo.Demo");
这样,我们就得到了我们需要的对象了,不过,这个对象不像我们平时new出来的对象那样,可以直接通过对象名来调用其中的方法。当然,我们是可以通过转换来调用的。这也是第一种的方式:
Demo de=obj as Demo;我们呢,可以通过as关键字将object类型的强制转换为我们需要的那个类的类型(这里用as来强制转换,当然也可以通过其他的方式),然后,我们就可以通过de这个对象名来访问其内部的成员了。
还有第二种方式:在这里,我们就用到了Type这个类啦,我们可以通过typeof先获取Demo(我们想获取的类)的类型,
Type DemoType = SampleAssembly.GetType("NSDemo.Demo");
得到类型后,我们还需要用到另外的一个类MethodInfo(这里面封装了一些方法的信息),来获取这个类中的方法。
 MethodInfo method = DemoType.GetMethod(" RunMethod ");
说到这,你也许就该想到了,方法中是有参数的,怎么办呢?
如果方法有参数的话,我们需要再定义一个object类型的数组:
object[] param = new object[] { "调用了" };(设方法的参数的String类型的)
然后,我们就用Invoke()来调用我们刚刚获取到的方法method。
method.Invoke(obj, param);第一个参数是该类的对象,第二个是我们要向方法中传入的参数(如果没有参数,那么就赋null值)。这是Invoke两个参数的用法,一般用到方法调用中。在下面的例子中,我们还会用到另一种方法。
第一种方式比较简洁,我个人推荐使用。
以上就完成了一次反射了。
下面,我们看一下另一个例子:
要想弄懂这个例子,我们还是先看看ConstructInfo这个类吧!
MSDN上这么描述的:发现类构造函数的属性并提供对构造函数元数据的访问权。对了,这个就是用来获取器构造函数的。说到这里,我们还是要提一下,构造函数也是分有参数和无参数的,在这个类中,有一个Invoke这个方法,它就提供了传递参数的功能。Invoke(object[]),看到这个,我们就应该知道,这个参数的传递也是通过object类型的数组来实现的。Invoke一个参数就是用到传递构造函数的参数时的。
值得注意的是,给构造函数传递参数是有了,同时,我们还需要给其定义。这就需要用到了Type类中的GetConstructor(Type[])这个方法了。Typt[]表示需要的构造函数的参数个数、顺序和类型的。里面放的是数据类型(如  int,要和构造函数的形参类型一样),下面就这个例子:
Type type = typeof(Demo_Class);
            ConstructorInfo constuct = type.GetConstructor(new Type[] { typeof(int) });
            object obj = constuct.Invoke(new object[] { 1 });//将构造函数赋给obj
            object[] param = new object[] { "调用了" };//定义方法中的参数
            MethodInfo mi = type.GetMethod("Method");//获取方法并赋给mi
            Console.WriteLine(mi.Invoke(obj, param));