我们继续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简谈反射(动态调用)的更多相关文章

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

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

  2. 使用反射动态调用ActiveX控件

    使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...

  3. ASP.NET中WebService的创建和部署以及通过反射动态调用WebService

    一.在ASP.NET中创建WebService 首先我们先创建一个ASP.NET Web 应用程序,此处我们以VS2017为例 点击新创建的项目,右键添加新建项,选择Web服务,输入名称后点击添加 这 ...

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

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

  5. 利用java反射动态调用方法,生成grid数据

    项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...

  6. 袁创:使用反射动态调用ActiveX控件

    ■■■■前言 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一般是使用vs.net工具自动生成的互操作性程序集.这种方法操作简单, ...

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

    反射的基本概念: .Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 创建Assembly和Entity两个程序集,在Assembl ...

  8. C#反射动态调用dll中的方法,并返回结果(转)

    反射的作用是动态的加载某个dll(程序集),并执行该程序集中的某个方法,并返回结果:当然也可以给该方法传递参数 namespace assembly_name { public class assem ...

  9. C#反射动态调用dll中的方法

    //加载程序集(dll文件地址),使用Assembly类 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirec ...

随机推荐

  1. address

    http://www.chsi.com.cn/ 学历查询网 http://www.gzzk.cc/ 广州自考网

  2. 去处HTML标签

    JavaScript去处HTML标签 function removeHTMLTag(str) { str = str.replace(/<\/?[^>]*>/g, ''); //去除 ...

  3. vi及缩进设置

    set autoindent,把当前行的对起格式应用到下一行: set smartindent,智能的选择对起方式: set tabstop=4,设置tab键为4个空格: set shiftwidth ...

  4. Shifting List Item Values From One List To Another In Oracle Forms

    Suppose you have two T-List items in form and you want  to shift element values from one list to ano ...

  5. Burpsuite之Http Basic认证爆破

    有的时候经常遇到401.今天正好朋友问怎么爆破,也顺便记录一下 怕忘记了 referer:http://www.2cto.com/Article/201303/194449.html 看到Burpsu ...

  6. Ubuntu中文输入法的添加

    做了一个英文环境的Ubuntu14.04LTS,为了写博客方便,添加了中文输入法,在网上搜寻了一堆方法,最后找到个靠谱的. 1 添加fcitx输入法框架.(在此框架下有各种输入法) sudo add- ...

  7. JVM 1.类的加载、连接、初始化

    Java类的加载是由类加载器来完成的,过程如下: 首先,加载是把硬盘.网络.数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用 ...

  8. iOS案例:读取指定目录下的文件列表

    // // main.m // 读取指定目录下的文件列表 // // Created by Apple on 15/11/24. // Copyright © 2015年 Apple. All rig ...

  9. DICOM标准相关资料

    由于需要阅读影像,对DICOM需要先熟悉起来.关于DICOM,找了一些资料,可以学习.如下: DICOM标准:http://dicom.nema.org/standard.html 中文 DICOM ...

  10. FLASH CC 2015 CANVAS 实际应用过程中遇到的【粉色】问题(不定期更新)

    1,导入音乐导致发布卡死 一开始以为是不支持,FQ搜索了一些帖子,也有说不能再时间轴加音乐,需要用代码加入,想想不太可能啊,如果真的不能为什么IDE不禁用呢? 而实际问题是: 我使用的其中一条音效有问 ...