在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
反射的定义 审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。 反射的作用 反射可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是什么样,另外.NET中的反射可以动态创建对象并执行它其中的方法。通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。 System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码 System.Reflection.Assembly 层次模型:
反射的用途: 反射用到的命名空间: NewClassw nc = new NewClassw(); type t = nc.GetType(); onstructorInfo[] ci = t.GetConstructors(); //获取类的所有构造函数 oreach (ConstructorInfo c in ci) //遍历每一个构造函数 ParameterInfo[] ps = c.GetParameters(); //取出每个构造函数的所有参数 foreach (ParameterInfo pi in ps) //遍历并打印所该构造函数的所有参数 { Console.Write(pi.ParameterType.ToString()+" "+pi.Name+","); } Console.WriteLine(); ype[] pt = new Type[2]; t[0] = typeof(string); t[1] = typeof(string); /根据参数类型获取构造函数 onstructorInfo ci = t.GetConstructor(pt); /构造Object数组,作为构造函数的输入参数 bject[] obj = new object[2]{"grayworm","hi.baidu.com/grayworm"}; /调用构造函数生成对象 bject o = ci.Invoke(obj); /调用生成的对象的方法测试是否对象生成成功 Type t = typeof(NewClassw); /构造函数的参数 bject[] obj = new object[2] { "grayworm", "hi.baidu.com/grayworm" }; /用Activator的CreateInstance静态方法,生成新对象 bject o = Activator.CreateInstance(t,"grayworm","hi.baidu.com/grayworm"); /((NewClassw)o).show();
NewClassw nc = new NewClassw(); 查看类中的public方法: NewClassw nc = new NewClassw(); Type t = nc.GetType(); MethodInfo[] mis = t.GetMethods(); foreach (MethodInfo mi in mis) { Console.WriteLine(mi.ReturnType+" "+mi.Name); } NewClassw nc = new NewClassw(); Type t = nc.GetType(); FieldInfo[] fis = t.GetFields(); foreach (FieldInfo fi in fis) { Console.WriteLine(fi.Name); } NewClassw nc = new NewClassw(); Type t = nc.GetType(); object obj = Activator.CreateInstance(t); //取得ID字段 FieldInfo fi = t.GetField("ID"); //给ID字段赋值 fi.SetValue(obj, "k001"); //取得MyName属性 PropertyInfo pi1 = t.GetProperty("MyName"); //给MyName属性赋值 pi1.SetValue(obj, "grayworm", null); PropertyInfo pi2 = t.GetProperty("MyInfo"); pi2.SetValue(obj, "hi.baidu.com/grayworm", null); //取得show方法 MethodInfo mi = t.GetMethod("show"); //调用show方法 mi.Invoke(obj, null);
Assembly ass = Assembly.Load("ClassLibrary831"); Type t = ass.GetType("ClassLibrary831.NewClass"); object o = Activator.CreateInstance(t, "grayworm", "http://hi.baidu.com/grayworm"); MethodInfo mi = t.GetMethod("show"); mi.Invoke(o, null); //通过DLL文件全名反射其中的所有类型 Assembly assembly = Assembly.LoadFrom("xxx.dll的路径"); Type[] aa = a.GetTypes(); foreach(Type t in aa) { if(t.FullName == "a.b.c") { object o = Activator.CreateInstance(t); } } |
请发表评论