我们继续C#基础知识的学习,这篇文章主要要讲的是我们C#程序员迈向高级C#程序员的关键性的一步。

有的朋友会说事实不是这样的,我不用反射就不能开发吗?当然可以,但是用与不用肯定是不一样的,任何复杂抽象的分层架构或者说是复杂的设计模式均是建立在这些基础之上的,比如我们要进行模块化、组件化开发,要严格的消除模块之间的耦合,要进行动态接口调用。这样的强大而灵活的系统开发,必须要用反射才行;任何技术都有它存在的价值和意义,只要我们把它用在合适的位置就能发挥出惊人的力量;能尽可能的减少我们编写的代码,更能是我们的代码便的清晰简洁;

下面我们就来学习C#中的反射的概念以及怎么使用它,用它能为我们提供什么样的好处,更重要的是能否将我们的技术台阶提升一个高度;

1.什么叫反射

要想快速的学习一种技术,首先我们要明白这个技术是干什么的,我们需要有个大局观,需要有个总体的认识了解,才能发挥出每个人本能的理解能力,而不是拉着你来理解我的想法,只有这样我们才能学的更快,不知不觉我们就能形成自己一套独立的思考能力;[王清培版权所有,转载请给出署名]

自然解释:射是一种自然现象,表现为受刺激物对刺激物的逆反应;这是反射的字面解释,我们看一下计算机编程中的反射;

编程解释:通过 System.Reflection 命名空间中的类以及 System.Type,您可以获取有关已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。 您也可以使用反射在运行时创建类型实例,以及调用和访问这些实例。这是来自微软官方的MSDN定义;

通过这两者的比较,我想对于我们初学者来说,反射就是通过某种事物去反射另一种事物;我们小时候进行喜欢用镜子对着墙上照,会出现一个个小光圈,这就是很典型的反射例子,我们把它理解成计算机里的反射就是我用某中对象去反射我无法直接获取到的东西;[王清培版权所有,转载请给出署名]

1:

这幅图我想还是比较形象的,至少在我们脑子里已经有了这么一个概念,反射、反射就是通过某种中间设备获取到另一端的东西。

C#里面反射跟上面的概念是一样的,原理也是一样的,下面我们就用代码示例来进行讲解,我想通过本篇文章的学习,您一定可以很透彻的理解反射的概念。

2.C#反射示例

2:

在我的解决方案里面有两个项目,Reflection是控制台应用程序,TestDll是我们所要反射的项目,在这个项目里面我定义了一个Math类,也就是我们要反射的对象;

为了演示方便,我们需要设置一下TestDll项目的生成输出路径,也就是我们主程序的启动目录;

3:

这样设置之后,我们项目的输出文件就会在我们应用程序的启动目录中,反射也就会方便一点,为了让初学者能少走弯路,我就费点事加上了;

按F6编译一下,会输出TestDll.dll文件到Reflection的Debug目录中,我们切换到Reflection中的Main方法中开始进行反射操作;

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Reflection;
  5. using System.Diagnostics;
  6. namespace Reflection
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. Assembly dll = Assembly.LoadFile(Environment.CurrentDirectory + "\\TestDll.dll");
  13. Type math = dll.GetType("TestDll.Math", true);
  14. MethodInfo method = math.GetMethod("add");
  15. int count = (int)method.Invoke(null, new object[] { 10, 20 });
  16. Console.WriteLine("Invoke Method:" + count.ToString());
  17. Console.ReadLine();
  18. }
  19. }
  20. }

我在Math类中定义了一个静态方法add,在这里我们就可以通过反射拿到Math对象进行动态调用了;

Assembly对象就好比我们日常生活中的镜子,我用这个镜子去照一下外部的DLL文件,那个文件里面的所有数据就可以反射给我了,我在通过托管对象进行一系列的获取调用了;具体的对象读者可以上网搜搜,大牛们讲解的比我详细,我只是做个入门介绍而已

总结:是不是用反射很神奇,我感觉反射真的很强大,这篇文章只是反射的一个简单的应用,后面我会讲解利用反射进行高配置的应用系统开发;其实要想掌握一门语言的语法不难,难的是语言背后的原理。软件是对硬件编程、软件的一切逻辑都是硬件的处理过程;所以我们当务之急就是快速的学会使用一门语言,然后去学习真正的软件奥秘;谢谢

转载于:https://blog.51cto.com/wangqingpei557/606400

.NET简谈反射(动态调用)相关推荐

  1. (C#)利用反射动态调用类成员[转载]

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

  2. 利用反射动态调用类成员C#

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

  3. C# 利用反射动态调用类成员

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下: public object InvokeMember( string name, BindingFla ...

  4. 反射动态调用DLL类库测试

    定义:可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌 ...

  5. C# 知识点笔记:IEnumerable的使用,利用反射动态调用方法

    IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...

  6. 通过.NET反射动态调用SetValue方法给属性PropertyInfo动态类型赋值

    注意:若不动态转换属性的值,简单调用SetValue方法赋值经常出错!特别是日期类型.带符号的数字类型等. 解决方案: 通过TypeDescriptor.GetConverter方法获取对应数值类型的 ...

  7. 利用.Net中的反射动态调用方法

    .Net中的反射功能是极其强大的,本篇先用他来动态调用方法 看如下一个类 Public Class A { public void InvokeMethod(string methodname) { ...

  8. 通过反射动态调用webservices

    该方法可以使程序不通过web引用的方式去调用webservices方法,直接在代码里调用该方法就能达到动态调用webservices的目的.使用前先引用System.Web.Services动态链接库 ...

  9. java反射 动态调用_java反射拼接方法名动态执行方法

    近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的.但是每个code确实对应一个方法的. code的值有很多个,自己又不想做ifelse或者s ...

  10. 利用反射,实现动态调用winform窗体

    实用前提:在WinForm程序中,通过主窗体的Menu打开不同的窗体 我以前的做法:在Menu的Click事件中,创建打开窗体的对象实例 这样的缺点,我不说了:) 看看利用反射动态调用窗体对象的方法: ...

最新文章

  1. Ansible01-Ansible基础和部署
  2. 信息系统项目管理师论文评分标准
  3. POJ1321(DFS)
  4. php字符集转换,php字符集转换
  5. Oracle Tuning ( instance 级别 ) 01
  6. 堆排序算法java左程云_堆排序算法以及JAVA实现
  7. DELL服务器双网卡绑定方法
  8. 2022 年不错的 SQL 注入 (SQLi) 检测工具
  9. 【数据库学习】数据库平台:Postgres(PG)与PostgreSQL
  10. 联想电脑进入BIOS曾经走过的“坑”
  11. 不知道怎么把英文文档翻译成中文?手把手教你怎么操作
  12. Mach Operating System
  13. ITIL 2011 -- 服务运营的5个流程简介
  14. DNS错误不能上网怎么办 电脑dns错误修复方法
  15. 忠魁互联网站SEO优化的外链建设方法
  16. 爬虫、知识图谱和开源情报分析01
  17. python之有关关键字参数,默认参数,不定长参数,位置参数的定义,区别,以及使用方法。
  18. 操作系统知识总结一(OS概述)
  19. 果园机器人是什么文体_24课果园机器人
  20. gtx1070显卡 linux,Ubuntu 16.04下Nvidia 显卡驱动安装

热门文章

  1. mac头和ip头部详解
  2. ARM平台AMBA总线uart驱动和console初始化
  3. 读写锁优先级的问题解决了
  4. gdb 打印字符串全部内容
  5. 结构体赋值 -- 构造函数
  6. C++与STL简单介绍( C/C++机试)
  7. Minix、UNIX、Linux的区别与联系
  8. 凸优化系列一:什么是最优化算法
  9. python中实用的collections模块
  10. 字符串全排列 java实现