反射
l反射无处不在,我们天天在使用。Vs的智能提示,就是通过反射获取到类的属性、方法等。还有反编译工具也是通过反射实现
l反射就是动态获取程序集的元数据(提供程序集的类型信息)的功能
Type类实现反射的一个重要的类,通过它我们可以获取类中的所有信息包括方法、属性等。可以动态调用类的属性、方法。 Type是对类的描述
•通过类获得Type:Type t = typeof(Person)
•通过对象获得类的Type:Type t = p.GetType()
•调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public类型。
•调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型。
•调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息。
动态创建对象
lActivator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
lType类的方法:
•boolIsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。
•typeof(IPlugin).IsAssignableFrom(t)
•boolIsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)
•boolIsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。
动态调用成员
lMemberInfo类 抽象类,有很多子类,下面讲的类都继承自它,获取程序集成员的相关信息(类型、方法、事件、字段和属性)
lPropertyInfo 获取属性
•主要成员:CanRead、CanWrite、PropertyType属性类型;SetValue、GetValue:读取值,设置值,第一个参数是实例对象,因为set、get要针对具体实例,最后一个参数null。pInfo.SetValue(p1, 30, null)
lMethodInfo 获取方法
•MethodInfo都是和具体对象不相关的,所以需要第一个参数指定要执行的对象。
lFieldInfo 获取字段
lEventInfo 获取事件