C#反射原理

一、前言


  反射(Reflection)的内容在博客中已经写了一篇,什么是反射,反射的使用,反射优缺点总结;在面试中突然被问道反射的原理,按照理解反射就是在Reflection命名空间和对象的Type对象获取类的方法、属性、特性等成员信息,但是又被问道为什么可以获取这些成员信息?就是反射机制依据的是什么,让其可以使用反射来获取程序集、程序集的类、创建对象、执行方法、获取属性和特性信息。

  本篇文章就是要讲述清楚反射是怎么或者说如何获取程序信息?

二、内容


反射是如何通过如下的Reflection命名空间的类与方法获取获取类,方法名?

命名空间

描述

System.Reflection.Assembly

程序集

System.Reflection.MemberInfo

成员信息

System.Reflection.EventInfo

事件

System.Reflection.FieldInfo

字段

System.Reflection.MethodBase

基类方法

System.Reflection.ConstructorInfo

构造函数

System.Reflection.MethodInfo

方法

System.Reflection.PropertyInfo

属性

System.Type

类、对象的类型对象

  主要依据了元数据(metadata),在程序高级语言中(C#)元数据的表现形式是一种二进制信息,用以对存储在公共语言运行库可移动执行文件(PE)或者存储在内存中程序进行描述,编译器將代码编译成PE文件时便会將元数据插入到该文件的一部分,而将代码转换为 Microsoft 中间语言 (MSIL) 并将其插入到该文件的另一部分中,所以包含元数据和使用中间语言將代码生成的部分。元数据將存储如下信息,程序集(名称、版本、区域性、公钥)、类的说明(名称、可见性、基类和实现的接口)、类的成员(方法、字段、属性、事件、嵌套的类型)等。当执行代码的时候,运行库將元数据加载到内存中,并通过引用它(元数据)来发现有关代码的类、成员、继承等信息。

  反射则是审查元数据并收集关于它的类型信息的能力,元数据(编译后的最基本数据单元)一些表,当编译程序集货模块时,编译器会创建如下信息。1、关于程序集的元数据(清单)主要包含如下信息:标识信息(包括程序集的名称、版本、文化和公钥等);文件列表(程序集由哪些文件组成);引用程序集列表(该程序集所引用的其他程序集);一组许可请求(运行这个程序集需要的许可)。2、关于类型的元数据包含一个类定义表、一个字段定义表、一个方法定义表、方法参数表等,System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码 。

三、总结


  通过面试被问到反射的原理,基于目前知识面只是知道反射是什么,怎么使用的,因为这件事情促使进一步深究了解到程序集,元数据的内容,了解到反射实现机制。从而对整个知识串联起来,形成一个体系,融会贯通。所以技术的学习过程是一个深入探究的过程,形成体系的过程,慢慢就会融会贯通了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值