7、 反射:
-> 什么是反射
万物接对象,类描述对象,而类也是对象,描述操作类的这套方法就是反射
-> 如何反射
-> 获得类型中所有成员的名字
Type类是用来描述类型的类
获得Type:
对象.GetType();
typeof(类型名)
-> 动态的调用dll中的方法
-> 反射用法
-> 使用Assimbly.Load(文件路径)获得Assembly对象
-> 使用Assembly对象的GetType方法获得Type
-> 使用类型获得Type对象
-> 使用Type对象获得成员对象
-> 会用Activator.CreateInstance(type)创建对象
-> 使用成员对象.Invoke(o, 参数)实现调用
Activator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
GetConstructor(参数列表);//这个是找到带参数的构造函数。
Type类的方法:在编写调用插件的程序时,需要做一系列验证。
bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。
typeof(IPlugin).IsAssignableFrom(t)
bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)
bool IsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。
IsAbstract,判断是否为抽象的,含接口
MemberInfo类 抽象类,有很多子类,下面讲的类都继承自它,获取程序集成员的相关信息(类型、方法、事件、字段和属性)
PropertyInfo 获取属性
主要成员:CanRead、CanWrite、PropertyType属性类型;SetValue、GetValue:读取值,设置值,第一个参数是实例对象,因为set、get要针对具体实例,最后一个参数null。pInfo.SetValue(p1, 30, null)
MethodInfo 获取方法
MethodInfo都是和具体对象不相关的,所以需要第一个参数指定要执行的对象。
FieldInfo 获取字段
EventInfo 获取事件
MemberInfo[] ms= type.GetMembers();
foreach (MemberInfo m in ms)
{
if(m.MemberType==MemberTypes.Method)
{
Console.WriteLine(m.Name);
}
}
// jklib.dll
Assembly asm = Assembly.LoadFile(Path.GetFullPath("jklib.dll"));
Type t = asm.GetType("jklib.Class1");
MethodInfo m = t.GetMethod("Func", BindingFlags.NonPublic | BindingFlags.Instance);
object o = Activator.CreateInstance(t);
m.Invoke(o, null);
Console.ReadKey();