.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

时间: 2024-10-13 11:58:14

.NET简谈反射(动态调用)的相关文章

http请求POST和GET调用接口以及反射动态调用Webservices类

此代码是API.WebSrvices动态调用的类,做接口调用时很实用. Webservices动态调用使用反射的方式很大的缺点是效率低,若有更好的动态调用webservices方法,望各位仁兄不吝贴上代码. using System; using System.IO; using System.Net; using System.Text; using System.Web; using System.Collections.Generic; using System.CodeDom.Compi

WebService的创建和部署以及通过反射动态调用WebService

一.在ASP.NET中创建WebService 首先我们先创建一个ASP.NET Web应用程序,此处我们以VS2017为例 点击新创建的项目,右键添加新建项,选择Web服务,输入名称点击添加 这样我们的基础的WebService就创建好了 接下来我们填加一个webservice的测试方法,并且打上特性标签WebMethod,只有打上特性标签WebMethod并且访问修饰符设置为public后外部才能调用到该方法 using System; using System.Collections.Ge

C#利用反射动态调用DLL并返回结果,和获取程序集的信息

反射的基本概念: .Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 创建Assembly和Entity两个程序集,在Assembly中添加Entity引用,如下图: namespace Entity { public class GetData { public static SIMPEntities SIMP = new SIMPEntities(); /// <summary> /// 查询方法--返回序列化json /

C# WeifenLuo.WinFormsUI.Docking.dll 应用之问题集 反射动态调用winform窗体

反射通过命名空间.窗体名称,调用窗体 public void OpenChildForm(string formName) { Type t = Type.GetType(formName); Assembly asm = Assembly.GetExecutingAssembly(); DockContent frm = asm.CreateInstance(formName) as DockContent; if (frm != null) { frm.Show(this.dockPanel

通过Java的反射动态调用类的set和get方法

方法一: 1 public static void main(String[] args) throws Exception { 2 Class clazz = Class.forName("TaskProvidePropsList");//这里的类名是全名..有包的话要加上包名 3 Object obj = clazz.newInstance(); 4 Field[] fields = clazz.getDeclaredFields(); 5 //写数据 6 for(Field f

反射动态调用子类方法

//Type type = Type.GetType("Domain.Entitiy." + item.Name);//object handler = Activator.CreateInstance(type);//Func<string, QueryStoresOutput> hook = o => ((dynamic)handler).QueryStore((dynamic)o);//var res = hook(cityCode); Type type =

golang通过反射动态调用方法

func Call(m map[string]interface{}, name string, params ...interface{}) ([]reflect.Value, error) { f := reflect.ValueOf(m[name]) if len(params) != f.Type().NumIn() { return nil, errors.New("the number of input params not match!") } in := make([]

C#反射动态调用dll中的方法,并返回结果

//加载程序集(dll文件地址),使用Assembly类 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Bin/App_Code.dll"); //获取类型,参数(名称空间+类) Type type = assembly.GetType("assembly_name.assembly_class"); //创建该对象的实例,object类型,参数(名称空间

动态调用WCF服务

本文转载:http://www.cnblogs.com/wiseant/archive/2010/07/29/1787599.html 原文地址:http://blog.csdn.net/castlooo/archive/2010/05/06/5562619.aspx 客户端调用wcf ,有时需要动态的调用服务端的WCF中的方法,本方法,反射wcf 的接口,动态调用接口中的方法. 主要为,动态绑定,反射动态调用. 1 Code highlighting produced by Actipro C