.NET简谈反射(动态调用)
我们继续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方法中开始进行反射操作;
using System;using System.Collections.Generic;using System.Text;using System.Reflection;using System.Diagnostics;namespace Reflection{ class Program { static void Main(string[] args) { Assembly dll = Assembly.LoadFile(Environment.CurrentDirectory + "\\TestDll.dll"); Type math = dll.GetType("TestDll.Math", true); MethodInfo method = math.GetMethod("add"); int count = (int)method.Invoke(null, new object[] { 10, 20 }); Console.WriteLine("Invoke Method:" + count.ToString()); Console.ReadLine(); } }} |
我在Math类中定义了一个静态方法add,在这里我们就可以通过反射拿到Math对象进行动态调用了;
Assembly对象就好比我们日常生活中的镜子,我用这个镜子去照一下外部的DLL文件,那个文件里面的所有数据就可以反射给我了,我在通过托管对象进行一系列的获取调用了;具体的对象读者可以上网搜搜,大牛们讲解的比我详细,我只是做个入门介绍而已;
总结:是不是用反射很神奇,我感觉反射真的很强大,这篇文章只是反射的一个简单的应用,后面我会讲解利用反射进行高配置的应用系统开发;其实要想掌握一门语言的语法不难,难的是语言背后的原理。软件是对硬件编程、软件的一切逻辑都是硬件的处理过程;所以我们当务之急就是快速的学会使用一门语言,然后去学习真正的软件奥秘;谢谢
引用地址:http://www.cnblogs.com/wangiqngpei557/archive/2011/07/08/2100994.html
.NET简谈反射(动态调用)的更多相关文章
- C# 利用反射动态调用类成员
用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): publicobject InvokeMember( string name, ...
- 使用反射动态调用ActiveX控件
使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...
- ASP.NET中WebService的创建和部署以及通过反射动态调用WebService
一.在ASP.NET中创建WebService 首先我们先创建一个ASP.NET Web 应用程序,此处我们以VS2017为例 点击新创建的项目,右键添加新建项,选择Web服务,输入名称后点击添加 这 ...
- C# 知识点笔记:IEnumerable<>的使用,利用反射动态调用方法
IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...
- 利用java反射动态调用方法,生成grid数据
项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...
- 袁创:使用反射动态调用ActiveX控件
■■■■前言 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一般是使用vs.net工具自动生成的互操作性程序集.这种方法操作简单, ...
- C#利用反射动态调用DLL并返回结果,和获取程序集的信息
反射的基本概念: .Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 创建Assembly和Entity两个程序集,在Assembl ...
- C#反射动态调用dll中的方法,并返回结果(转)
反射的作用是动态的加载某个dll(程序集),并执行该程序集中的某个方法,并返回结果:当然也可以给该方法传递参数 namespace assembly_name { public class assem ...
- C#反射动态调用dll中的方法
//加载程序集(dll文件地址),使用Assembly类 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirec ...
随机推荐
- 达人眼中的WINCE网络驱动
实际上在WinCE上开发网络驱动,比如设计一个NIC驱动, 大多数情况,是从XP移植NDIS Miniport驱动(小端口驱动)到WinCE.什么是ndis?Ndis做什么用的? 什么是minipor ...
- JSONObject.fromObject
JSONObject.fromObjectjava.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRun ...
- [HDOJ1231]最大连续子序列
混了好几个地方的博客,还是觉得博客园比较靠谱,于是决定在这里安家落户了.本人本科生一个,希望各位巨巨多多指教~ Hello World! 单独一个象征性的问候实在是太low了,还是决定来点实质性的.. ...
- TI公司Tina-ti和FilterProDesktop下载地址
http://www.ti.com/tool/tina-ti http://focus.ti.com/en/download/aap/DesignEnv/FilterPro-DT/FilterProD ...
- 解决iOS内存泄露
文章很好,摘自:http://www.codeceo.com/article/xcode-instruments-ios-memory.html 虽然iOS 5.0版本之后加入了ARC机制,由于相互引 ...
- Android中的文件权限操作
默认本工程创建的文件本工程对其有读写权限. 我们可以通过context.openFileOutput("文件名", 模式): 我们可以创建私有, 共有, 只读, 只写文件, 默认的 ...
- JavaWEB 常用开发模式MVC+三层结构
MVC开发模式: M: Model -- JavaBean C: Controler -- Servlet V: View --- JSP 不会在word里面画画,所以就直接截了 老 ...
- iOS - UISlider
前言 NS_CLASS_AVAILABLE_IOS(2_0) __TVOS_PROHIBITED @interface UISlider : UIControl <NSCoding> @a ...
- mysql概要(七)表字段管理,字段的增删改
1.添加列 放在某列之后 放第一列: 2.修改(声明和名字),删除列 2.1修改声明 2.2删除列
- js 函数-Tom
函数类型 在ECMAScript 中有三种函数类型:函数声明,函数表达式和函数构造器创建的函数.每一种都有自己的特点. 函数声明 函数声明(缩写为FD)是这样一种函数: 有一个特定的名称 在源码中的位 ...