在学习反射之前,先来理解以下几个概念。 1、什么是程序集? 程序集是.net中的概念。 .Net中的dll文件与exe文件都是程序集。(exe与dll的区别?) exe文件是可执行文件,有执行入口。...程序集包含资源文件、类型元数据(描述在代码中定义的每一类型和成员,二进制形式)、IL代码(这些都被装在exe或dll中),每个程序集都有自己的名称、版本等信息。...3、什么是反射? 反射就是动态获得程序集里面的元数据。(比如获取某一个类里面的属性和方法,后面会有代码演示) 4、如何添加程序集的引用?...添加路径、项目引用 不能循环添加引用 5、代码演示 新建一个空白解决方案,添加一个控制台应用程序和一个名为Common的类库。...在Common里面添加一个Person类和Student类,代码如下 public class Person { public Person(string name, int age
这节讲一下.NET 中的一个技术:反射(Reflection)。 反射是一种很重要的技术,它可以在程序运行时,动态的获取类的实例,并调用实例中的任何方法。...typeof 说反射之前,要先知道typeof这个关键字,它是反射的核心,typeof可以动态的获取某个类的类型信息,反射通过这些类型信息,就可以生成实例等一些操作。...Reflection 反射的命名空间位于System.Reflection,下面开始演示反射的代码(动态的创建实例对象): 有以下一个接口和实现类做演示: interfaceIReflection...当然,反射一般不会这么直接使用,一般都是将其封装起来,基于反射,编写一些框架,有个很好的反射的例子就是依赖注入(ASP.NET Core中的核心基础之一就是依赖注入,参见前文:依赖倒置原则)。...反射是.NET 中的一个技术,但它在使用中又是隐式的,所以本篇文章只能是管中窥豹,若要了解更多,读者可以阅读一些源码,或者查看官方文档,获取更多关于Type类及反射的用法。
浅谈.Net反射系列基本来到了尾声,本文主要从.Net Framework的源码角度去分析: System.Reflection命名空间下定义的类型 以及Type类型 首先各个反射类型都继承于MemberInfo...virtual bool IsSubclassOf(Type c) public override string ToString() 通过上面的定义,从Type对象代表的是一个类,以类为第一视角去定义了很多属性和方法...object obj) public void SetValue(object obj, object value) 通过上面的定义,从FieldInfo对象代表的是一个字段,以字段为第一视角去定义了很多属性和方法...MethodInfo GetAddMethod(bool nonPublic); public abstract MethodInfo GetRemoveMethod(bool nonPublic); 浅谈.Net...反射系列全部结束
在正式开始介绍反射的概念之前,我们先了解一下元数据。 元数据概述 C#代码在经过编译之后会得到二进制格式的程序集,程序集一般是一个.dll或.exe后缀的文件。...具体包含类型的名称,基类,以及一些指向MethodDef,FieldDef,PropertyDef和EventDef区域的索引。 MethodDef:在程序集中定义的每一个方法都有一个记录项。...具体包含类型的名称和一个指向该类型的位置的引用。 MemberRef:模块引用的每一个成员(字段,方法,属性,事件)这个表中都有一个记录项。...具体包含成员的名称和签名,以及一个指向定义该成员的那个类型的TypeRef记录项。 对于上面列出来的定义表和引用表,并不是编译器生成的全部信息,编译器还生成了很多其他的定义表和引用表。...AssemblyDef:程序集标识记录项 包含程序集名称,版本,语言文化等 FileDef:作为程序集一部分的每一个PE文件和资源文件都有一个记录项。 具体包含文件名,扩展名等。
对于字段、属性、方法、事件等具体成员类型来说,它们包含的信息显然是不一样的,因此,在.NET中提供了FieldInfo类型来封装字段的信息,它继承自MemberInfo。...属性信息与PropertyInfo类型 和字段类似,System.Reflection.PropertyInfo封装了类型的属性信息,可以通过GetProperties()方法获取类型的所有属性信息。
接着《浅谈.Net反射 4》文章里面的代码,我们继续。 如何进一步查看类型信息?...MemberExplore()方法在Type的实例上调用了GetMembers()方法获取了成员信息的一个数组,然后遍历了数组,打印了成员的名称和类型。...注意到Name属性在编译后变为了get_Name()和set_Name()两个独立的方法;myEvent事件的注册(+=)和取消注册(-=)分别成为了add_myEvent()和remove_myEvent...同时,发现私有字段name没有被打印出来,而基类System.Object的成员GetType()和Equals()被打印了出来。...BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly ); 我们看一下Type类中的GetMember和GetMembers
反射是动态操作元数据的能力,从程序集-模块-类型-字段-属性-方法-参数等,反射可以动态操作这些部分,在编译时不确定,在运行中动态确定,并进行有效控制。...今天本文主要聊聊Type类,反射的核心是Type类,这个类封装了关于类型的元数据,也是进行反射的入口。...当获得了类型的Type对象后,就可以根据Type提供的属性和方法获取这个类型的一切信息,包括构造函数、字段、属性、事件、方法、参数等。...通过上图,可以获得: memoryStream对象的类型, 类型的命名空间, 类型的基类, 在.NET运行库中的映射类型, 是public、private,还是protected, 是值类型还是引用类型...其他的一些属性和方法 由于MemberInfo是一个抽象基类,在获得一个MemberInfo对象后,并不知道它的实际类型是PropertyInfo还是FieldInfo。
在前面几篇当中,先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,以及如何利用反射来获取特性对象。 在本文中,将学习如何使用反射动态地创建一个对象。...本小节讨论的调用不是将上面动态创建好的对象由Object类型强制转换成Calculator类型再进行方法调用,这样就和普通的方法调用没有区别了,而是利用反射,基于字符串来调用方法。...Instance Method: [Add]: 3 plus 5 equals to 8 先使用GetMethod()方法获取了一个方法对象MethodInfo,指定BindingFlags为Instance和Public...BindingFlags.InvokeMethod, null, t, parameters); 输出的结果为: Invoke Static Method: [Add]: 6 plus 9 equals to 15 和调用实例方法进行一下对比...如果不使用反射,则只能写一些if-else语句,先判断选择的项的值,然后再根据值决定调用哪个方法。
在.NET中,提供了System.Type类和System.Reflection命名空间实现了反射的功能。...Type抽象类提供了访问类型元数据的能力,当实例化了一个Type对象后,可以通过它的属性和方法,获取类型的元数据信息,或者进一步获得该类型的成员的元数据信息。...访问类型元数据的操作,就叫做反射。 .NET中反射的一个示例 在.Net FCL中,也经常能看到反射的影子,这里就向大家演示一个最常见的例子。大家知道,C#中一共有两种类型: 一种是值类型。...到了需要使用反射的时候了。...我们现在对反射有了大致的了解: 它通过System.Reflection命名空间并配合System.Type类,提供了在运行时(Runtime)对类型和类型成员的元数据(metadata)的访问能力。
反射程序集 在.NET中,程序集是进行部署、版本控制的基本单元。 System.Reflection命名空间下的Assembly类型,代表了一个程序集,并包含了关于程序集的信息。...现在看下反射提供了哪些能力让我们获取关于程序集的信息,如表所示(只列出了部分常用的)。 ?
反射前传-遍历枚举类型 本文不会深入讲解反射,只是完成一个小功能:遍历枚举类型。在后续的文章里会具体讲解反射技术。...在.NET中,提供了System.Type类和System.Reflection命名空间来帮助我们实现这个功能。...Type抽象类提供了访问类型元数据的能力,当实例化了一个Type对象后,可以通过它的属性和方法,获取类型的元数据信息,或者进一步获得该类型的成员的元数据信息。...Sunday } 里面有枚举字段的值,字段名称,和描述信息。...May, June, July, August, September, October, November, December } 我们想遍历Months类型的枚举值,和上面的
反射特性 假设我们在实现一个方法A,但是因为某种原因,这个方法A设计的不够好,我们需要重新设计一个方法B来代替方法A,因为很多客户程序中已经在使用旧版本的方法A了,如果简单地删除掉旧的方法A,使用老版本方法...这个时候,我们应该同时保留A和B两个方法。那么我们会希望告知客户程序现在有一个全新的方法B可供使用,但此时客户程序并不知道已经存在一个新的方法B,那么又该如何做呢?...在.NET中可以使用特性来完成这一工作。特性是一种特殊的类型,可以标记到程序集或者程序集中的类型上,这些类型包括模块、类、接口、结构、构造函数、方法、方法参数等,标记了特性的类型称作特性的目标。...但是这里却仅用Obsolete来标记方法,这是.NET的一个约定,所有的特性应该均以Attribute来结尾,在为对象标记特性时,如果没有添加Attribute,编译器会自动寻找带有Attribute的版本...所以使用自定义特性的目的是使用反射查看自定义特性并在程序中的某处使用它。
与前面不同的是,MethodInfo可以具有参数和返回值,MethodInfo类提供了GetParameters()方法获取参数对象的数组,方法的参数都封装在了ParameterInfo类型中。...ConstructorInfo类型和EventInfo类型 这两个类型封装了类型的构造函数和事件信息,查看这些类型与之前的方法类似,通过调用Type对象中的下面两方法就可以返回: public ConstructorInfo...GetConstructors(); public virtual EventInfo[] GetEvents(); 本文回顾: 方法信息与MethodInfo类型 ConstructorInfo类型和EventInfo
在.net框架体系内,反射特性较多的应用到。反射的相关定义分为两种。 ...,您可以获取有关已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。 ...您也可以使用反射在运行时创建类型实例,以及调用和访问这些实。...反射(Reflection)有下列用途:它允许在运行时查看属性(attribute)信息;它允许审查集合中的各种类型,以及实例化这些类型;它允许延迟绑定的方法和属性(property);它允许在运行时创建新类型...下面介绍一下有关反射的程序集的相关属性和方法的源码: (1).Object的GetType()方法: // Returns a Type object which represent
.Net中的反射(反射特性) - Part.3 2008-2-17 作者: 张子阳 分类: .Net 框架 反射特性(Attribute) 可能很多人还不了解特性,所以我们先了解一下什么是特性。....Net内置特性介绍 .Net 中可以使用特性来完成这一工作。...但是这里却仅用Obsolete来标记方法,这是.Net的一个约定,所有的特性应该均以Attribute来结尾,在为对象标记特性时如果没有添加Attribute,编译器会自动寻找带有Attribute的版本...这里大家一定疑惑为什么会这样划分参数,这和特性的使用是相关的。...使用反射查看自定义特性 利用反射来查看 自定义特性信息 与 查看其他信息 类似,首先基于类型(本例中是DemoClass)获取一个Type对象,然后调用Type对象的GetCustomAttributes
对于“反射肯定是造成性能差的主要原因”这种说法,要冷静客观的分析。 .NET平台可以使用元数据完整的描述类型(类,结构,委托,枚举,接口)。...许多.NET技术,例如WCF或序列化都需要在运行时发现类型格式。在.NET中,查看和操作元数据的动作称为反射(也称为元编程)。 ? 反射就是和程序集打交道。上图显示了程序集的阶层关系。...ORM通过反射获得类型及其成员,然后为其赋值。 使用反射时,一个重要的类型是System.Type类,其会返回加载堆上的类型对象(包括静态成员和方法表)。....NET中的反射一例 当我们比较两个引用类型的变量是否相等时,我们比较的是这两个变量所指向的是不是堆上的同一个实例(内存地址是否相同)。而当我们比较两个结构体是否相等时,怎么做呢?...反射优化的根本方法只有一条路:避开反射。然而,避开的方法可分为二种: 1. 用委托和表达式树去调用。(绕弯子) 2. 生成直接调用代码,替代反射调用。
1 反射技术与设计模式 反射(Reflection)是。NET中的重要机制,通过放射,可以在运行时获得。...NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。...NET项目中,采用反射技术的工厂已经基本代替了工厂方法。 采用反射技术可以极大地简化对象的生成,对以下设计模式的实现也有很大影响。 ...另外,函数指针只能引用静态函数,而委托可以引用静态和实例方法。委托主要用于。NET Framework中的事件处理程序和回调函数。 ...NET的委托更好地实现了GOF所阐述的意图,结构上也更为灵活。但这两种委托解决的不是一个层面的问题,GOF的委托强调的是一种策略,而。NET和委托技术则是具体实现。
注解和反射 在Java的学习中,我们会对代码附有条条框框的要求,注解为我们提供了这么一条渠道 在Java的学习中,我们有时要突破Java本身的规矩,反射的暴力解法也为我们提供了其他的可能性 注解入门...“准动态语言” 反射 Java反射机制: 是指在运行时去获得一个类的变量和方法信息。...System.out.println("--------"); //第二种方法获得构造方法(c.getDeclaredConstructors()) //这种方法获得public和private...System.out.println(con); } System.out.println("--------"); //第三中方法获得构造方法( c.getConstructor()和c.getDeclaredConstructor...> c = Class.forName("Demo3.Student"); //获得成员变量的方法和获得构造方法的格式基本一致,分为四种: //c.getFields(
.Net中的反射(序章) - Part.1 2008-1-27 作者: 张子阳 分类: .Net 框架 引言 反射是.Net提供给我们的一件强力武器,尽管大多数情况下我们不常用到反射,尽管我们可能也不需要精通它...本文将分为下面几个部分介绍.Net中的反射: 序章,我将通过一个例子来引出反射,获得对反射的第一印象。 查看类型基本信息 反射特性(Attribute)。...这段代码是我们按照思路假想和推导出来的。实际上,.Net 中提供了 Type类 和 System.Reflection命名空间来帮助解决我们现在的问题。...上面的实现并没有考虑到性能的问题,仅仅为了引出反射使用的一个实例。 .Net 中反射的一个范例 不管是VS2005的智能提示,还是修改变量名时的重构功能,都使用了反射功能。...在.Net FCL中,也经常能看到反射的影子,这里就向大家演示一个最常见的例子。大家知道,在CLR中一共有两种类型,一种是值类型,一种是引用类型。
toStringMethodInfo); 76 //generator.EmitCall(OpCodes.Call, toStringMethodInfo, null); //和上面代码...writeLineMethodInfo); 86 //generator.EmitCall(OpCodes.Call, writeLineMethodInfo, null); //和上面代码...writeLineMethodInfo); 72 //generator.EmitCall(OpCodes.Call, writeLineMethodInfo, null); //和上面代码
领取专属 10元无门槛券
手把手带您无忧上云