1、什么是元数据,什么是反射?
A、程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据。
B、有关程序及其类型的数据被称为元数据,它们保存在程序的程序集中。
C、程序运行时,可以查看其它程序集或其本身的元数据。一个运行的程序查看本身的元数据或其他程序集的元数据的行为叫做反射。
下面我们来学习如何使用Type类来反射数据,以及如何使用特性来给类型添加元数据,Type位于System.Reflection命名空间下。
2、Type类
预定义的类型(int、string 等),BCL中的类型(Console,IEnumerable等)和程序员自定义类型(MyClass,MyDel等)。每种类型都有自己的成员等相关信息。BCB声明了一个叫做Type的抽象类,它被设计用来包含类型本身的相关信息。使用这个类的对象能让我们获取程序使用的类型的信息。
由于Type是抽象类,因此不能利用它去实例化对象。关于Type的重要事项如下:
A、对于程序中用到的第一个类型,CLR都会创建一个包含这个类型信息的Type类型的对象。
B、程序中用到的每一个类型都会关联到独立的Type类的对象。
C、不管创建的类型有多少个实例,只有一个Type对象会关联到所有这些实例。
3、获取Type的对象
获取Type对象有两种方式
A、Type t=myInstance.GetType();//通过类的实例来获取Type对象,在object类有一个GetType的方法返回Type对象,因为所有类型都是从object继承的,所以我们可以在任何类型上使用这个方法。
B、Type t=typeof(ClassName);//直接通过typeof运算符和类名获取Type对象
Type类型里提供了很多获取类型各种信息的方法,比如获取属性、方法、自定义特性、类型所在程序集等等,例如获取里面的字段
FieldInfo[] fi=t.GetFields();//
4、Assembly类
Assembly类在System.Reflection命名空间中定义,它允许访问给定程序集的元数据,它也包含了可以加载和执行程序集。
如何加载程序集?
1、Assembly assembley1=Assembly.Load("SomeAssembly");根据程序集的名字加载程序集,它会在本地目录和全局程序集缓存目录查找符合名字的程序集。
2、Assembly assembly2=Assembly.LoadFrom(@"C:\XX\XXX\SomeAssembly.dll")//这里的参数是程序集的完整路劲名,它不会在其它位置搜索。
3、MyClass item=new MyClass();
Assembly assembly3=my.GetType().Assembly;//通过类的Type对象获取它所在的程序集Assembly