所有.Net类都是定义在某个Assembly(程序集)中的,.Net基本类是定义在mscorlib.dll中。exe也可以看做是类库,也可以引用。.net的exe也是Assembly,.net中的exe和dll的区别就是exe中包含入口函数,其他没有区别,exe也可以当成dll那样引用、也可以反编译。
GAC:全局程序集缓存。公用的Assembly放到GAC中。(*)
Assembly类是对程序集的描述(*)。
•(*)AppDomain.CurrentDomain.GetAssemblies()获得程序所有的Assembly
•Assembly.LoadFile(),动态从文件加载Assembly,不需要在编译的时候引用。
反射:Type类
Type类可以叫做“类的类”,一个类型对应一个Type类的对象,通过Type对象可以获得类的所有的定义信息,比如类有哪些属性、哪些方
等。Type就是对类的描述。
获得Type对象的方法:
通过类获得Type:Type t = typeof(Person)
通过对象获得类的Type:Type t = p.GetType()
调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public类型。
调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型。
调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息。
Activator.CreateInstance(Type t)会动态调用类的public无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函
数就会报错。
应用:动态创建对象SayHello(代码见备注)。接口声明到单独的项目中,避免循环引用。
Type类的方法:
bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。IDbCommandsp; SqlCommandbsp; AccessSettingsProvider msp; sp可以从bsp、msp赋值(sp=bsp;sp=msp)。 bsp可以从msp赋值(bsp=msp)。
bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)
bool IsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。如果当前类
是MemSettingsProvider,c是ISettingsProvider,则返回false
动态调用成员
使用备注中的Person类进行测试。
调用Type的GetProperty方法可以根据属性名获得属性对象PropertyInfo,主要成员:CanRead、CanWrite、PropertyType属性类
型;SetValue、GetValue:读取值,设置值,第一个参数是实例对象,因为set、get要针对具体实例,最
后一个参数null。type.GetProperty(“Age”).SetValue(p1, 30, null),Type、MethodInfo都是和具体对象不相关的,所以需要第一个
参数指定要执行的对象。
调用Type的GetMethod方法可以根据方法名获得方法对象MethodBase,调用MethodBase 的Invoke方法就可以调用方法,第一个
参数是实例对象,第二个参数是参数数组,如果没有参数设置为null。对Age不能SetValue(p1,"20",null)
GetMethod方法默认一个string参数的方法只能获得没有重载方法的方法,要获得重载方法要用GetMethod(string name, Type[]
types)这个重载函数,第二个参数是匹配方法的参数类型数组。
Type类还有很多方法:GetConstructor(获得构造函数)、GetEvent(获得事件)、GetProperties(获得所有属性)等。