经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
c#反射
来源:cnblogs  作者:JoyandJoys  时间:2018/10/23 9:29:15  对本文有异议

写在前面:此随笔仅仅是作为个人学习总结,有不对的地方,请各位前辈指正O(∩_∩)O........

一: 什么是反射

运行时获取类型信息的方式,动态加载dll.通常我们的类库生成之后会生成两个文件一个dll一个pdb文件.其中pdb用于调试,dll又由两部分组成:IL和metadata(元数据).反射就是动态加载dll里面的元数据部分获取到信息.

二: 应用场景

只说一个.当我们只知道一个类型的名字,不知道所在的位置和具体信息的时候,我们可以通过反射技术来知道写这个类的程序员想让我们知道的内部的信息.来获取和使用

三: 具体操作

3.1: 通过反射获取到类信息,和实现程序的可配置

  1. //使用反射
  2. Assembly assembly = Assembly.Load("Reflection.One"); //生成assmbly对象,动态加载dll,是反射的入口
  3. Type type = assembly.GetType("Reflection.One.Common"); //获取类型
  4. object o = Activator.CreateInstance(type); //根据类型创建一个object对象,此时调用的是无参数的构造函数
  5. ICommon oCommon = o as ICommon; //根据接口类型转换object对象
  6. oCommon.Method1();
  7. foreach(var module in assembly.GetModules()) //使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法
  8. {
  9. Console.WriteLine(module);
  10. }
  11. foreach(var t in assembly.GetTypes()) //获取程序集中所有的类型
  12. {
  13. Console.WriteLine(t);
  14. }
  15. //通过有参数构造函数来创建对象
  16. object[] conParam = new object[] { "Joy" };//构造函数的参数列表
  17. object o2 = Activator.CreateInstance(type1,conParam);
  18. ICommon oCommon2 = o2 as Common;

如何实现程序的可配置

  1. //通过反射实现程序的可配置,通过类型来创建对象
  2. string configSetting = ConfigurationManager.AppSettings["dll"];
  3. string[] configArr = configSetting.Split(',');
  4. Assembly assembly1 = Assembly.Load(configArr[0]);
  5. Type type1 = assembly.GetType(configArr[1]);
  6. object o1 = Activator.CreateInstance(type1);
  7. ICommon oCommon1 = o1 as ICommon;
  8. oCommon1.Method1();
  9. //配置文件
  10. <configuration>
  11. <startup>
  12. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  13. </startup>
  14. <appSettings>
  15. <add key="dll" value="Reflection.One,Reflection.One.Common"/>
  16. </appSettings>
  17. </configuration>

a: 为什么说是程序的可配置?

答: 只需要修改配置文件,不需要修改任何程序就可以实现不同的内容,比如连接mysql数据库和sql server数据库.

3.2: 通过反射调用方法

通过反射调用方法?上面3.1里面的不是也可以调用方法吗?是的,但是3.1里面的我们需要知道他们实现了哪一个接口,如果不知道实现了哪个接口我们同样是不能知道怎么调用程序集内部的方法.

获取到方法:

  1. foreach(var m in type.GetMethods())
  2. {
  3. Console.WriteLine(m.Name);
  4. }

  

a: 为什么没有看到Method4呢?

答: 我们可以看到Method4方法是私有的,而我们获取方法的方式不能获取到私有方法.

b:  tostring(),equals(),getHashCode(),getType()方法是哪里来的呢?

答: 我们可以知道object类是所有类型的父类,而object里面有这几个方法,就可以知道这几个方法是继承至object里面的

c: 怎么获取到私有方法呢?

答: MethodInfo method4 = type.GetMethod("Method4", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

d: 输出结果里面怎么有两个相同的method3呢?又怎么调用呢?

答: 显然这是一个重载方法. 怎么调用?在获取方法的时候我们可以通过参数列表来判断获取的是哪一个方法,然后再来调用

  1. MethodInfo method31 = type.GetMethod("Method3", new Type[] { }); //无参数
  2. method31.Invoke(o2, null); //调用
  3. MethodInfo method32 = type.GetMethod("Method3", new Type[] { typeof(int)}); // 有个int参数
  4. method32.Invoke(o2, new object[] { 1}); //调用,new object[] 为参数列表

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号