大多数程序都要处理数据,包括读、写、操作和显示数据,但对于某些程序而言它们操作的数据不是数字、文字或图形,而是程序和程序类本身的信息。
1、有关程序和其类型的数据被称为元数据,它们保存在程序的程序集中。
2、程序在运行时,可以查看其它程序集或自身的元数据。一个运行的程序查看本身的元数据或其他程序的元数据的行为被称为反射。
BCL声明了一个叫做Type的抽象类,它被设计用来包含类型的特性。这个类的对象能让我们获取程序使用的类型的信息。由于Type是抽象类,因此它不能有实例,而是在运行时,CLR创建从Type派生的类的实例,访问这些实例时,CLR不会返回派生类的引用而是Type基类的引用。
对于程序中用到的每一个类型,CLR都会创建一个包含这个类型信息的Type类型的对象程序中用到的每一个类型都会关联到独立的Type类的对象,不管创建的类型有多少个实例,只有一个Type对象会关联到这些实例。
class BaseClass { public int MyFieldBase; } class DerivedClass:BaseClass { public int MyFieldDerived; } class Program { static void Main(string[] args) { Type tbc = typeof(DerivedClass); Console.WriteLine("Result is {0}.", tbc.Name); Console.WriteLine("It has the following fields:"); FieldInfo[] fi = tbc.GetFields(); foreach (var f in fi) Console.WriteLine($"{f.Name}"); Console.ReadLine(); } }
输出:
Result is DerivedClass.
It has the following fields:
MyFieldDerived
MyFieldBase
也可以通过程序集获取:
var type = Assembly.GetExecutingAssembly().GetType("MetaData.BaseClass");
输出:
BaseClass