程序集

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