c#

位置:IT落伍者 >> c# >> 浏览文章

.NET简谈反射(动态调用)


发布日期:2019年08月21日
 
.NET简谈反射(动态调用)

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

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

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

什么叫反射

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

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

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

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

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

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

C#反射示例

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

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

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

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

view sourceprint?

using System;

using SystemCollectionsGeneric;

using SystemText;

using SystemReflection;

using SystemDiagnostics;

namespace Reflection

{

class Program

{

static void Main(string[] args)

{

Assembly dll = AssemblyLoadFile(EnvironmentCurrentDirectory + \\TestDlldll

Type math = dllGetType(TestDllMath true)

MethodInfo method = mathGetMethod(add

int count = (int)methodInvoke(null new object[] { })

ConsoleWriteLine(Invoke Method: + countToString())

ConsoleReadLine()

}

}

}

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

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

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

               

上一篇:C#.NET windows控件实现水印

下一篇:.NET中的特殊类型成员