.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 ...
随机推荐
- TortoiseGit安装与配置
TortoiseGit 简称 tgit, 中文名海龟Git. 海龟Git只支持神器 Windows 系统, 有一个前辈海龟SVN, TortoiseSVN和TortoiseGit都是非常优秀的开源的版 ...
- Objective C 基础
1,字符串加@: 不加@的是C语言字符串. 加@的代表的是OC的NSString http://www.jikexueyuan.com/course/71_2.html 2,setValuesForK ...
- C#多线程之二:ManualResetEvent和AutoResetEvent
初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...
- 【Unity3D游戏开发】定制新建C#文件的头描述 (三三)
unity添加新脚本的时候,可以定制[开发者姓名][开发日期][文件描述][版权声明]等,省的到时候不知道谁写的,也没有个描述,关键是TNND连个背锅的人都没有 其实unity已经给我们提供了新建脚本 ...
- unity3d 游戏对象消失三种方法的区别(enabled/Destroy/active)
gameObject.renderer.enabled //是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的 GameObject.Destr ...
- Cheatsheet: 2013 06.01 ~ 06.22
.NET Git for Visual Studio and .NET developers How to download multiple files concurrently using Web ...
- Mybatis+SpringMVC+Spring整合
1,先添加spring支持: applicationContext.xml 配在WEBINF下,四个命名空间:aop,context,tx,p 配Listener:ContextLoaderList ...
- SQL Server 小技巧【2】
--1.不要使用×来查询所有字段 SELECT * FROM DBO.tb1 --改为 SELECT FName,PWD,CreateDate FROM DBO.tb1 (NOLOCK) --2.查询 ...
- Android图形显示之硬件抽象层Gralloc(hal 转)
原文 http://blog.csdn.net/yangwen123/article/details/12192401 FrameBuffer驱动程序分析 文中介绍了Linux系统下的显示驱动框架, ...
- ERROR 1201 (HY000) Could not initialize master info structure
1.错误原因:Slave线程启动出现问题.2.解决办法一:stop slave; reset slave; start slave; show slave status\G3.如果解决方法一,还是失败 ...