所有
.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
(获得所有属性)等。