【C#】:浅谈反射机制

什么是反射?

反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。

反射机制是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。

通俗的来讲,就是反射是通过一个对象去了解另一个对象的内部结构和信息,即使在你不知道那个对象存在的情况下。就好比是海船的声纳探测一样,我们并不知道海水深处是什么情况,但是通过声呐反射回来的情况,就可以掌握障碍物的大小,移动速度等等,和我们所谈论的反射是一个道理。但是我们在程序使用反射不仅可以获取,类的内部情况,还可以操作调用反射类的方法,简直是太神奇了。

为什么用反射?

1使用了反射后,你的程序在更新的时候无需重新编译,只要将更新的Dll换掉即可完成程序的更新和升级。

2将反射和配置文件相结合,可以开发出功能随意增删改的软件,具备了极大地灵活性和扩展性。

3反射提高了程序的灵活性,降低了耦合性,提高了自适应能力,同时也大大提高了程序的复用性。

但是要强调的一点是,任何事物都有两面性,不是所有场合都适合使用反射技术的。使用反射也会有其缺点:

1首先带来的一个很大的问题就是——性能问题,使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。

2使用反射会使程序内部逻辑模糊化,程序员在调试代码的时候西瓦昂看到清晰的程序逻辑,而反射却绕过了源代码,因此会带来一定的维护性问题,同时反射代码比相应的直接代码更加复杂。

综上所述:反射机制有其适用的场合,只要用来开发对灵活性和扩展性要求很高的软件系统,普通的程序没必要使用。

怎么用反射?

首先声明我对反射的使用不是很深入,只是做了一些简单的尝试,下面用一个小Demo来说明如何在C#中使用反射获取一个类的属性、方法以及修改属性和调用方法等。代码如下:

首先我们先写一个目标类Student

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ITOO.Reflection.Student
{
    public class Student
    {
        public string Name { get; set; }

        public int Age { get; set; }

        // 默认构造函数
        public Student()
        {
            this.Age = 24;
            this.Name = "连江伟";
        }
        //带参数的构造函数
        public Student(string name,int age)
        {
            this.Name = name;
            this.Age = age;
        }

        public void Hello()
        {
            Console.WriteLine("我是"+Name +",我今年"+Age +"岁了!");
        }
    }
}</span>

然后我们在控制台应用程序中去利用反射操纵这个类

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ITOO.Reflection.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            //动态加载DLL,这个LoadFile最方便,参数就是dll的路径。
            var asm = Assembly.LoadFile(@"C:\Users\ljw\Desktop\学习例子\ITOO.Reflection.Test\ITOO.Reflection.Student\bin\Debug\ITOO.Reflection.Student.dll");
            //获取Student类的类型
            var type = asm.GetType("ITOO.Reflection.Student.Student");
            //创建该类的实例
            var instance = asm.CreateInstance("ITOO.Reflection.Student.Student");
            //为学生类的属性赋值
            type.GetProperty("Name").SetValue(instance, "段天涯", null);
            type.GetProperty("Age").SetValue(instance, 18, null);
            //获取Student类的方法
            var method = type.GetMethod("Hello");
            //调用Student类的成员方法Hello
            method.Invoke(instance, null);
            Console.Read();
        }
    }
}</span>

小结一下:对于反射这个概念,一开始我是比较模糊的,虽然很多次的听到别人在说在讲,但是由于没有自己去查资料去研究,去动手代码实现,终究不能感同身受,理解其中的原理和思想,如今阅读了大量的博客和文章之后,又动手实践了一下,有了一些浅浅的理解,由于Donet的反射机制是封装好的,所以对于反射内部实现原理还不清楚,期待以后能够继续深入学习。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 04:53:54

【C#】:浅谈反射机制的相关文章

【C#】:浅谈反射机制 【转】

http://blog.csdn.net/lianjiangwei/article/details/47207875 什么是反射? 反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性,可以利用反射对它们进行访问. 反射机制是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’.‘模块(Module)’.‘类型(class

浅谈 Attention 机制的理解

什么是注意力机制? 注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制.例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目标区域,也就是注意力焦点.然后对这一区域投入更多的注意力资源,以获得更多所需要关注的目标的细节信息,并抑制其它无用信息. 图片来源:深度学习中的注意力机制,其中红色区域表示更关注的区域. Encoder-Decoder 框架 目前大多数的注意力模型都是依附在 Encoder-Decoder 框架下,

反射?它是什么?浅谈反射

一开始学习反射的时候,有点不太理解什么是反射,后来我查了一下关于反射得理解 反射是什么? 1 定义: JAVA Reflection 我给它的定义就是动态的调用的一个对象的方法,或者动态的获得一个对象的属性 我查了一下关于百度的介绍 编辑 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. JAVA反射(放射)机制:“程序运行时,允许改变程

c#浅谈反射内存的处理

这段时间由于公司的项目的要求,我利用c#的反射的机制做了一个客户端框架.客户端里的所有的模块都是以一定形式进行提供,例如:FORM,UserControl. 在做的过程中很简单与愉快.具体的过程如下: 1:收集客户的需求 2:整理需求,形成必要的文档 3:通过讨论大体的得到程序的界面风格 4:由UI设计师设计出来具体的界面形式 5:通过需求封装必要的服务(我们可以使用c#的WCF服务或者JAVA的服务) 6:制作服务管理框架 7:封装程序要使用到的控件 8:编写客户端框架 9:编写模块 10:加

反射入门-浅谈反射用途_根据Ado游标对象创建list集合

本人大二菜鸟一只,今天在上课期间有个同学看着C#反射的内容说反射没什么用,一时之间也想不到什么更好的例子,就写了个根据泛型类型和游标反射创建List集合的Demo. 首先创建一个用于封装对应数据的entity,代码如下. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test { public

浅谈多态机制的意义及实现

转自:http://blog.hesey.net/2010/12/significance-and-implementation-of-polymorphism.html: 在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事. 多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorp

浅谈binder机制

前段时间一直在看有关Binder的知识,最近刚好有时间,总结一些一些知识,希望和大家交流学习. 说起Binder我相信大家学android开发的多多少少都对binder有些了解,binder机制作为android进程间通信的一种机制,在Android底层中应用的非常多.我们都知道Android系统是基于LInux内核开发的,Linux内核提供了丰富的进程间通信的机制,如:管道.信号.消息队列.共享内存和套接字等,但是Android系统并没有采用传统的进程间通信机制,而是开发了一套新的进程间通信的

[转载]浅谈多态机制的意义及实现

http://blog.hesey.net/2010/12/significance-and-implementation-of-polymorphism.html 在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事. 多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorphism

浅谈闭包机制

var foo = "Hello"; var c =(function a() { function b(){ var bar = " World"; alert(foo + bar); return bar; } return b; })()(); alert(foo + c); 本实例弹出两次hello world: 一.什么是闭包? “官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式