VR基础25-控制台编程 反射的应用.pdfVIP

  • 1
  • 0
  • 约2.25千字
  • 约 3页
  • 2021-01-27 发布于山东
  • 举报
反射生成对象 1.用Type 构建对象 用构造函数动态生成对象: 既然有反射 那就有“正射” 对比一下: 有一个class Test 有无参构造方法 获取实例的比较: “正”:由类名直接使用关键字new 来获得 语法:new Test () 反射:未知类名 运行时获得类型名:例如:Type type = Type.GetType(Test); Object o = type.GetConstructor (new Type[]{}).Invoke (null); 当然参数也可以由配置文件获得 以上调用无参构造 带参的构造怎么调用呢? 2.用Activator 生成对象: Type t = typeof(NewClassw); //构造函数的参数 object[] obj = new object[2] { 实参1, 实参2 }; //用Activator 的CreateInstance 静态方法,生成新对象 object o = Activator.CreateInstance(t,obj); 3.Assembly 生成对象: Assembly assembly = Assembly.Load (ReflectTest); Object obj = assembly.CreateInstance (ReflectTest.Wood); 反射获取字段 一般用于已知对象时使用,同样用正反来做对比,已知对象MyClass obj,对象内有name 这 个字段。 正: obj.name = xxx即可设置该对象的值 obj.name 即可获得该对象的值 反射: //获取类的描述对象 Type t = obj.GetType(); //取得字段描述对象 FieldInfo fi = t.GetField(name); //获取或设置字段值 fi.SetValue(obj, k001); fi.GetValue(obj); 一般在C# 中以属性替代字段 //获取类的描述对象 Type t = obj.GetType(); //取得属性描述对象 PropertyInfo pi1 = t.GetProperty(Name); //获取或设置属性值 pi1.SetValue(obj, k001,null); pi1.GetValue(obj,null); 反射调用方法 一般用于对象、方法名、参数类型已知的情况 对象:obj 方法名:methodName 参数类型 String int 正: 直接给予参数调用:obj.methodName (实参1,实参2(int) ) 反射: //获取类的描述对象 Type t = obj.GetType(); //取得方法描述对象 MethodInfo mi = t.GetMethod(show); //调用方法 mi.Invoke(obj, 实参1,实参2(int)); 参数可以换成数组 反射载入程序集 System.Reflection.Assembly 类 Assembly 类可以获得程序集的信息,也可以动态的加载程序集,以及在程序集中查找类型 信息,并创建该类型的实例。 使用Assembly 类可以降低程序集之间的耦合,有利于软件结构的合理化。 通过程序集名称返回Assembly 对象 Assembly ass = Assembly.Load(ClassLibrary831); 通过DLL 文件名称返回Assembly 对象 Assembly ass = Assembly.LoadFrom(ClassLibrary831.dll); 通过Assembly 获取程序集中类 Type t = ass.GetType(ClassLibrary831.NewClass); //参数必须是类的全名 通过Assembly 获取程序集中所有的类 Type[] t = ass.GetTypes(); //通过程序集的名称反射 Assembly ass = Assembly.Load(ClassLibrary831); Type t = ass.GetType(ClassLibrary831.NewClass); object o = Activator.CreateInstance(t, , ); MethodInfo mi = t.GetMethod(show); mi.Invoke(o, null); //通过DLL

文档评论(0)

1亿VIP精品文档

相关文档