程序集

所有 .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 类型变量的赋值。 IDbCommand sp ;  SqlCommand bsp ; Access Settings Provider   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 (获得所有属性)等。

你可能感兴趣的:(程序)