反射的应用为了解藕程序,让程序日后的维护和二次开发时动用的代码部分很少。
要用到的命名空间using reflection
1.在程序运行时,(动态获取类或对象的信息)
动态 获取 加载程序集(Assmebly)
动态 获取 类型(如类、接口 等) - Type对象
动态 获取 类型的成员 信息(如方法,字段,属性等);
2.在运行时,动态创建类型实例(new),以及 调用 和 访问 这些 实例 成员;
创建的步骤:
1 获取当前的程序集方式:
1.1 获取当前的程序域的所有assembly : AppDomain.CurrentDomain.GetAssemblies()
1.2获取当前的对象的程序集:this.GetType().Assembly
1.3根据路径加载Assembly: Assembly.LoadFrom("路径") 或者 Assembly.load("当期的路径") 或 Assembly.LoadFile("路径")
2 获取Type对象 的方式
2.1通过类获取对应的Type :Type t=Typeof(Person)
2.2通过对象得Type t=p.GetType()
2.3通过程序集获得当前的类 Type t=assembly.GetType("类名")
2.4程序集的所有public 类 type[] t=assembly.GetExportedType()
2.5所有类 Type[] t=Assembly.GetTypes()
对象的创建
Type pigType = ass.GetType("PigLib.Pig", false, true);
object instance1 = Activator.CreateInstance(pigType);
//总结:ass.CreateInstance()和Activator.CreateInstance() 要求类拥有一个无参数的构造函数
//3.0 通过有参数的构造函数进行实例的创建工作
//3.0.1 获取Pig类型中的构造函数对象
ConstructorInfo cinfo = pigType.GetConstructor(new Type[] { typeof(string) });
//3.0.2 调用构造函数
object instancd2 = cinfo.Invoke(new object[] { "小黑" }); //object instancd2 =new Pig("小黑");
获取字段的和方法的使用
//2.0 从ass中获取Pig类的Type类型
Type pigType = ass.GetType("PigLib.Pig", false, true);
//3.0从Type中获取字段的对象 FielidInfo
//注意点:BindingFlags.Instance | BindingFlags.NonPublic 表示获取类中的实例非公有字段
//BindingFlags.Instance :表示一个实例字段 BindingFlags.Static:表示一个静态字段
// BindingFlags.NonPublic:非公有的字段 BindingFlags.Public:公有的字段
//重点注意:如果要使用则 BindingFlags.Instance | BindingFlags.NonPublic要在一起
FieldInfo nameInfo = pigType.GetField("_name", BindingFlags.Instance | BindingFlags.NonPublic);
//4.0 给_name字段赋值
object instance = Activator.CreateInstance(pigType); //ass.CreateInstance("PigLib.Pig");
nameInfo.SetValue(instance, "小白");
//5.0 获取_name字段的值
object res = nameInfo.GetValue(instance);
MessageBox.Show(res.ToString());
属性:
type.Assembly:获取type所在的程序集对象
type.FullName:获取type对象对应的类的全名称,命名空间.类名
type.Name:获取type对象对应类的 名称,不带有命名空间的
type.IsArray:判断type是否为一个数组类
type.IsEnum:判断type是否为一个枚举类
方法:
type.IsAssignableFrom(Type i) :判断i是否实现了接口 type
type.IsSubclassOf(Type father):判断type是否继承了 father
type.IsInstanceOfType(object o) :判断 o 是否为type类的实例
type.GetFiled("gender"):获取type中名为gender的字段对象
type.GetMethod("SayHi"):对象
type.GetProperty("Age"):获取type中名为 Age 的属获取type中名为 SayHi 的方法性对象