.NET反射一

      在了解什么是反射之前首先要知道一些基础知识点。

      一.Type

      .NET所有类型都是对象,对象的本身也是有某些特征的,如:所在程序集,其所有成员,这些关于对象的特征也可以封装在一个对象里面,这个对象就是Type。当我们要获取某个对象的信息的时候其实就是获取该对象对应的Type对象。方法大概有以下这三种:

1 //第一种通过Type的静态函数
2   Type type1 = Type.GetType("System.Int32");
3 Console.WriteLine(type1.Assembly.FullName);//获取类型所在的程序集
4
5 //第二种是通过Type的成员函数GetType
6   System.Int32 a = 0;
7 Type type2 = a.GetType();
8 Console.WriteLine(type2.Assembly.FullName);
9
10 //通过typeof
11   Type type3=typeof(System.Int32);
12 Console.WriteLine(type3.Assembly.FullName);
13
14

     二.程序集

      1.首先要明白什么是.NET程序集:
      程序集(Assembly)是.NET程序的最小组成单位。每个程序集都有自己的名称、版本等信息。程序集通常表现为一个文件(.exe或.dll文件),这样的程序集被称为单文件程 序集,这种程序集是最常见的。程序集也可以由多个文件组成,每个文件都是一个模块文件或者是一个资源文件,这样的程序集被称为多文件程序集。程序集是一个托管模块,其中存储了类型元数据和中间语言。中间语言是我们写的代码经过语言编译器编译过的托管代码,而元数据是用来描述该模块中我们所定义的类型和成员等等,因此我们说程序集是自描述的程序集清单就是由这些元数据组成的,程序集清单包含指定该程序集的版本要求和安全标识所需的所有元数据,以及定义该程序集的范围和解析对资源和类的引用所需的全部元数据。

关于程序集与命名空间:
      装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在,这样说可能有点模糊,举个例子:
装配件A: 

代码
namespace N1
{
public class AC1 {…}
public class AC2 {…}
}
namespace N2
{
public class AC3 {…}
public class AC4{…}
}
装配件B:
namespace N1
{
public class BC1 {…}
public class BC2 {…}
}
namespace N2
{
public class BC3 {…}
public class BC4{…}
}

 

 

      这两个装配件中都有N1和N2两个命名空间,而且各声明了两个类,这样是完全可以的,然后我们在一个应用程序中引用装配件A,那么在这个应用程序中,我们能看到N1下面的类为AC1和AC2,N2下面的类为AC3和AC4。 接着我们去掉对A的引用,加上对B的引用,那么我们在这个应用程序下能看到的N1下面的类变成了BC1和BC2,N2下面也一样。 如果我们同时引用这两个装配件,那么N1下面我们就能看到四个类:AC1、AC2、BC1和BC2。到这里,我们可以清楚一个概念了,命名空间只是说明一个类型是那个族的,比如有人是汉族、有人是回族;而装配件表明一个类型住在哪里,比如有人住在北京、有人住在上海;那么北京有汉族人,也有回族人,上海有汉族人,也有回族人,这是不矛盾的。(此处有参照其他博文)

posted @ 2010-12-17 23:33  雁北飞  阅读(173)  评论(0编辑  收藏  举报