1、 什么是反射 1、什么是反射 Reflection,中文翻译为反射。 Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。 2、命名空间与装配件(程序集)的关系 很多人对这个概念可能还是很不清晰,对于合格的.Net程序员,有必要对这点进行澄清。 装配件(程序集)是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件。 装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在,这样说可能有点模糊,举个例子: 这两个装配件中都有N1和N2两个命名空间,而且各声明了两个类,这样是完全可以的,然后我们在一个应用程序中引用装配件A,那么在这个应用程序中,我们能看到N1下面的类为AC1和AC2,N2下面的类为AC3和AC4。 到这里,我们可以清楚一个概念了,命名空间只是说明一个类型是那个族的(类似Java的包),比如有人是汉族、有人是回族;而装配件表明一个类型住在哪里(即程序集在哪里运行),比如有人住在北京、有人住在上海;那么北京有汉族人,也有回族人,上海有汉族人,也有回族人,这是不矛盾的。 上面我们说了,装配件是一个类型居住的地方,那么在一个程序中要使用一个类,就必须告诉编译器这个类住在哪儿,编译器才能找到它,也就是说必须引用该装配件。 3、运行期得到类型信息有什么用 有人也许疑问,既然在开发时就能够写好代码,干嘛还放到运行期去做,不光繁琐,而且效率也受影响。 接着说,运行期得到类型信息到底有什么用呢? 这个接口中包含一个Extension属性,这个属性返回支持的扩展名,另一个方法返回一个解码器的对象(这里我假设了一个Decoder的类,这个类提供把文件流解码的功能,扩展插件可以派生之),通过解码器对象我就可以解释文件流。 这就是一个反射的典型应用。 首先我们来看如何获得类型信息。 需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件,或者在已经获得的Assembly 实例上面调用GetType。 System.String 是在 mscorlib.dll 中声明的,上面的 Type t = Type.GetType(“System.String”)是正确的 5、如何根据类型来动态创建对象 Type t = Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 例二:根据有参数的构造器创建对象
namespace TestSpace public string GetValue( string prefix ) { public string Value 上面是一个简单的类,包含一个有参数的构造器,一个GetValue的方法,一个Value属性,我们可以通过方法的名称来得到方法并且调用之,如: //获取类型信息 //构造器的参数 //根据类型创建对象 //获取方法的信息 //调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值 //GetValue方法的参数 //调用方法,用一个object接收返回值 属性与方法的调用大同小异,大家也可以参考MSDN 7、动态创建委托 委托是C#中实现事件的基础,有时候不可避免的要动态的创建委托,实际上委托也是一种类型:System.Delegate,所有的委托都是从这个类派生的 namespace TestSpace 使用示例: TestClass obj = new TestClass(); //获取类型,实际上这里也可以直接用typeof来获取类型 //创建代理,传入类型、创建代理的对象以及方法名称 String returnValue = method(“hello”); 8、C#反射实例讲解 1) 创建用于反射使用的DLL 新建一个C#类库项目,拷贝源代码如下,编译生成DLL(假如DLL的文件名是TestReflect.dll) namespace Webtest public string WriteString(string s) public static string WriteName(string s) public string WriteNoPara()
在ASPNET页面中加入以下函数: public void test1() method = type.GetMethod("WriteNoPara");//无参数的实例方法 9、反射在下列情况下很有用: 参考: |
C#中的反射知识
最新推荐文章于 2022-04-02 12:03:36 发布
C#] - C#中的反射知识
2007年10月10日 10:58