【.NET Core】反射(Reflection)详解(一)

【.NET Core】反射(Reflection)详解(一)

文章目录

  • 【.NET Core】反射(Reflection)详解(一)
    • 一、什么是反射
    • 二、Assembly类
      • 2.1 LoadFile
      • 2.2 Load
      • 2.3 LoadFrom(String)
      • 2.4 GetName()
      • 2.5 GetModules()
      • 2.6 GetModule(String)
      • 2.7 GetTypes()
      • 2.8 GetType(String,Boolean,Boolean)
    • 三、Module 类
      • 3.1 FilterTypeName
      • 3.2 FilterTypeNameIgnoreCase
      • 3.3 Assembly
      • 3.4 FullyQualifiedName
      • 3.5 ModuleVersionId
      • 3.6 Name
      • 3.6 ScopeName
      • 3.7 Equals(Object)
      • 3.7 FindTypes(TypeFilter,Object)
      • 3.8 GetCustomAttributes方法
      • 3.9 GetField方法
      • 3.10 GetFields()方法
      • 3.11 GetMethods()方法
      • 3.12 GetMethod()方法
      • 3.13 GetType()方法
      • 3.14 GetCustomAttribute方法
    • 四、总结
    • 五、参考

一、什么是反射

Reflection(反射)是动态获取运行时类型信息的一种方式。.NET的应用程序由几个部分组成:程序集(Assembly)、模块(Module)、类型(Class)组成,而反射提供了一种编程方式。能让程序员可以在程序运行期获得这几个组成部分的相关信息。

二、Assembly类

Assembly表示一个程序集,它是一个可重用、无版本冲突且可自我描述的公共语言运行时应用程序构建基块。

Assembly使用类加载程序集,浏览程序集的元数据和构成部分、发现程序集中包含的类型以及创建这些类的实例。

如要获取表示当前加载到应用程序集的Assembly数组。可以使用AppDomain.GetAssemblies方法。

下面介绍Assembly常用的属性和方法:

2.1 LoadFile

加载指定路径上的程序集文件的内容。

Assembly assembly = Assembly.LoadFile("D:\\DLL\\GoyeerClassLoad.dll");

2.2 Load

  • Assembly.Load(AssemblyName):在给定程序集的AssemblyName的情况下,加载程序集。
  • Assembly.Load(Byte[]):加载带有基本通用对象文件格式(COFF)的映像的程序集,该映像包含已发出的程序集。此程序集将会加载到调用方的应用程序域中。
  • Assembly.Load(Byte[],Byte[]):加载带有基本通用对象文件(COFF)的映射的程序集,此映像包含一个已发出的程序集,并且还可以选择包含程序集的符号。此程序集将会加载到调用方的应用程序域中。
  • Assembly.Load(String):用指定的名称加载程序集。
Assembly assemblyLoad = Assembly.Load("AwinicClassLoad, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

2.3 LoadFrom(String)

已知程序集的文件名或路径,加载程序集。

Assembly assemblyForm = Assembly.LoadFrom("D:\\DLL\\AwinicClassLoad.dll");

2.4 GetName()

此方法获取此程序集的AssemblyName。

 AssemblyName assemblyName=  assembly.GetName();

2.5 GetModules()

获取作为此程序集的一部分的所有模块。

Module[] modules = assembly.GetModules();

2.6 GetModule(String)

获取此程序集加载指定的清单资源。

Module[] modules = assembly.GetModules("goyeer.StringHelper");

2.7 GetTypes()

获取程序集中定义的所有类型

Type[] types  = assembly.GetTypes();

2.8 GetType(String,Boolean,Boolean)

获取程序集实例中具有指定名称的Type对象,并选择在找不到该类型是引发异常

//获取当前实例的Type
Type type = assembly.GetType();
//获取程序集实例中具有指定名称的Type对象
Type type1 = assembly.GetType("GoyeerLib.StringHelper");
//获取程序集实例中具有指定名称的Type对象,并选择在找不到该类型时引发异常
Type type2 = assembly.GetType("GoyeerLib.StringHelper",false);
//获取程序集实例中具有指定名称的Type对象,带有忽略大小写和在找不到该类型时引发异常的选项
Type type3 = assembly.GetType("GoyeerLib.StringHelper",false,false);

三、Module 类

模块是可移植的可执行文件,一个DLL或EXE,由一个或多个类和接口组成。单个模块可包含多个命名空间,而一个命名空间可跨越多个模块。一个可部署的程序集是有一个或多个模块组成。在反射中,我们可以通过Assembly程序集,获取对应程序集中的某一个指定模块或所有的模块。下面我们将介绍Model类中常用的属性及方法。

3.1 FilterTypeName

Module中的一个字段,该对象是根据名称筛选在此模块中定义的类型列表。此字段区分大小写且为只读。

Type[] tArray = myModule.FindTypes(Module.FilterTypeName, "My*");

3.2 FilterTypeNameIgnoreCase

Module中的一个字段,一个TypeFilter对象,该对象根据名称筛选在此模块中定义的类型列表。此字段不区分大小写且为只读。

3.3 Assembly

Module的属性,为此Module实例获取适当的Assembly

Module myModule = moduleArray[0];
Assembly myAssembly = myModule.Assembly;

3.4 FullyQualifiedName

Module的属性,获取表示此模块的完全限定名和路径的字符串。

Module myModule = moduleArray[0];
string fullName = myModule.FullyQualifiedName

3.5 ModuleVersionId

获取可用于区分模块的两个版本的全局唯一标识符(UUID)。可用于区分模块的两个版本的Guid

Module myModule = modules[0];
Guid versionId=  myModule.GetModuleVersionId();

3.6 Name

获取String,它表示移除了路径的模块名

Module myModule = modules[0];
string name=  myModule.Name;

显示结果和FullyQualifiedName区别如下显示内容

name=GoyeerClassLoad.dll;
FullyQualifiedName=D:\Office\Debug\GoyeerClassLoad.dll

3.6 ScopeName

获取表示模块名称的字符串如Name

3.7 Equals(Object)

确定此模块和指定的对象是否相等。

3.7 FindTypes(TypeFilter,Object)

返回给定筛选器和筛选条件接受的类数组。

Module myModule = moduleArray[0];
Type[] tArray;
tArray = myModule.FindTypes(Module.FilterTypeName, "My*");

3.8 GetCustomAttributes方法

返回模块自定义属性,包含两个方法GetCustomAttributes(Boolean)和获取指定的自定义属性GetCustomAttributers(Type,Boolean) 获取指定类型的自定义属性。

Module myModule = moduleArray[0];
object[] attributes;
attributes = myModule.GetCustomAttributes(true);

3.9 GetField方法

包含两个方法GetField(String)返回具有指定名称的方法和GetField(String,BindingFlags)返回具有指定名称和绑定特性的字段。返回字段的类型为FieldInfo。

3.10 GetFields()方法

返回在模块上定义的全局字段。包含两个方法GetFields(BindingFlags)返回在于指定绑定标志匹配的模块上定义的全局字段和GetFields()返回在模块上定义的全局字段。此方法返回一个类型为FieldInfo的数组。表示在与指定的绑定标志匹配的模块上定义的全局字段;如果没有全局字段匹配绑定标志,则返回空数组。

3.11 GetMethods()方法

此方法返回模块定义的全局方法。包含两个重载方法:

GetMethods():返回在模块中定义的全局方法。

GetMethods(BindingFlags):返回在与指定的绑定标志匹配的模块上定义的全局方法。

此方法返回模块中定义的所有全局方法的MethodInfo对象数组;如果没有全局方法,则返回空数组。

3.12 GetMethod()方法

此方法返回具有指定条件的方法。此方法包含以下三个重载:

  • GetMethod(String):返回具有指定名称的方法。
  • GetMethod(String,Type[]):返回具有指定名称和参数类型的方法。
  • GetMethod(String,BindingFlags,Binder,CallingConvertions,Type[],ParameterModifier[]):返回具有指定名称,绑定信息,调用约定和参数类型及修饰符的方法。

3.13 GetType()方法

此方法返回指定的类型。此方法包含三个重载方法:

  • GetType(String):返回指定的类型,执行区分大小写的搜索。
  • GetType(String,Boolean):返回指定的类型,通过指定的区分大小写搜索模块。
  • GetType(String,Boolean,Boolean):返回指定的类型,指定是否对该模块进行区分大小写的搜索;如果找不到该类型,则指定是否引发异常。

3.14 GetCustomAttribute方法

此方法是Module类的扩展属性,检索应用于指定元素的自定义属性。有以下重载方法:

  • GetCustomAttribute(Assembly,Type) :检索应用于指定程序集的指定类型的自定义特性。
  • GetCustomAttribute(MemberInfo,Type) :检索应用于指定成员的指定类型的自定义特性。
  • GetCustomAttribute(Module,Type) :检索应用于指定模块的指定类型的自定义特性。
  • GetCustomAttribute(ParameterInfo,Type) :检索应用于指定参数的指定类型的自定义特性。
  • GetCustomAttribute(MemberInfo,Type,Boolean) :检索应用于指定成员的指定类型的自定义特性,并可选择检查该成员的上级

四、总结

本文讲解反射中常用的使用类AssemblyModule类,及如何将程序集通过反射获取对应的信息,下一篇将注重讲解Type、MethodInfo、FieldInfo及CustomAttributes等。

五、参考

https://learn.microsoft.com/zh-cn/dotnet/api/system.reflection.assembly?view=net-7.0

https://learn.microsoft.com/zh-cn/dotnet/api/system.reflection.module?view=net-7.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/234294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu推送本地仓库到coding

本教程提供在ubuntu系统下推送本地仓库到coding的指令,用于查阅 一、主要步骤有: 0.初始化仓库 git init 1.添加远程仓库 git remote add origin https://coding.git #修改自己仓库链接 (命名仓库别名为origin) 2.提交代码…

Ansible:模块2

1,command模块 一般用于执行linux的命令,不支持管道符和重定向。 2,shell模块 相当于command的升级版,也可以执行linux命令,支持管道符和重定向 3,cron 模块 在远程主机生成定时任务 分 时 日 月 周 m…

多级缓存:亿级流量的缓存方案

文章目录 一.多级缓存的引入二.JVM进程缓存三.Lua语法入门四.多级缓存1.OpenResty2.查询Tomcat3.Redis缓存预热4.查询Redis缓存5.Nginx本地缓存6.缓存同步 一.多级缓存的引入 传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未…

存储:windows 10 硬盘盒 新盘 SSD分区

1.准备好绿联2.5英寸 2.准备好 SSD 磁盘 3.接入硬盘和盒子 4.win10 电脑 win x 然后选择磁盘管理 (磁盘管理 K) 5.它会提示需要初始化的一个新的磁盘,确定初始化 6.添加卷 7.命名盘符 8.检测是否识别到盘符 9.end

【学习笔记】部署yolov8到安卓手机

一、环境配置和源码安装 首先你需要配置好pytorch环境,本文不再详细阐述,若未配置好环境,可以参考我的另一篇博客:https://blog.csdn.net/liujiahao123987/article/details/128743017 yolov8的安装可参考:https://blog…

【C语言 | 内存管理】野指针、静态区、堆、栈、常见的内存错误及对策

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

【MATLAB源码-第101期】基于matlab的蝙蝠优化算BA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 蝙蝠算法(BA)是一种基于群体智能的优化算法,灵感来源于蝙蝠捕食时的回声定位行为。这种算法模拟蝙蝠使用回声定位来探测猎物、避开障碍物的能力。在蝙蝠算法中,每只虚拟蝙蝠代表…

软件测试实现Finddler的手机抓包过程

Fiddler的手机抓包过程 1、启动Fiddler 打开菜单栏中的 Tools > Fiddler Options,打开“Fiddler Options”对话框: 2、在Fiddler Options”对话框 切换到“Connections”选项卡,然后勾选“Allow romote computers to connect”后面的复选…

UE5 C++(七)— UObject、UGameInstance实例化

文章目录 UObject实例化创建一个MyObject类在Default Pawn Class 中实现MyObject中参数调用 UGameInstance实例化创建GameInstance UObject实例化 创建一个MyObject类 在Default Pawn Class 中实现 注意:要实现运行时调用可在这里提前配置,具体参考之前…

(数据结构)单链表的插入删除

代码实现 #include<stdio.h> #include<stdlib.h> typedef struct LNode {int data;struct LNode* next; }LNode, * LinkList; //创建头结点 LNode* InitList(LinkList L) {L (LNode*)malloc(sizeof(LNode));if (L NULL){printf("申请头结点失败\n");…

公共字段自动填充——后端

场景&#xff1a;当处理一些请求时&#xff0c;会重复的对数据库的某些字段进行赋值&#xff08;如&#xff1a;在插入和更新某个物品时&#xff0c;需要更新该物品的更新时间和更新者的信息&#xff09;&#xff0c;这样会导致代码冗余。 如&#xff1a; 思路&#xff1a; 自…

【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 组合总和1 class So…

环境监测升级:钡铼技术的水利环保工业路由器

随着环保意识的提高和科技的发展&#xff0c;环境监测已经成为我们日常生活的重要组成部分。为了满足日益增长的环境监测需求&#xff0c;钡铼技术推出了一款水利环保工业路由器&#xff0c;该路由器具有出色的性能和功能&#xff0c;为环境监测的升级提供了有力支持。 这款工…

6、查询性能优化

为什么查询速度会慢 在编写快速查询之前&#xff0c;需要清楚一点&#xff0c;真正重要的是响应时间。如果把查询看作是一个任务&#xff0c;那么他由一系列子任务组成&#xff0c;每个子任务都会消耗一定的时间。如果要优化查询&#xff0c;实际上要优化其子任务&#xff0c;…

脉冲水表计量方法有哪些?

随着社会的发展和人们对资源的需求不断增长&#xff0c;水资源的有效利用显得尤为重要。而水表作为测量家庭和工业用水的关键设备&#xff0c;其准确性和稳定性对于水资源管理至关重要。本文将重点介绍水表脉冲数计量方法&#xff0c;以帮助读者更好地理解和应用水资源。 一、机…

vue3项目引入电子签名(可横屏竖屏)

实现效果&#xff1a;&#xff08;左边横屏&#xff0c;右边竖屏&#xff09; 前言&#xff1a;【使用开源项目smooth-signature 实现签名的功能。Gitee 地址是 &#xff1a;GitHub - linjc/smooth-signature: H5带笔锋手写签名&#xff0c;支持PC端和移动端&#xff0c;任何前…

【超图】SuperMap iClient3D for WebGL/WebGPU ——地形影像

作者&#xff1a;taco 号外&#xff01;号外&#xff01;开新坑了&#xff01;开新坑了&#xff01;对于一个代码小白来讲&#xff0c;设置可能是刚接触开发的人&#xff08;还没接触准备接触&#xff09;的人来说。对于读代码或是在对产品的使用上会存在许许多多的疑惑。接下来…

Linux 如何查看架构和系统

Linux 如何查看架构和系统 在 Linux 系统上&#xff0c;你可以使用一些命令来查看系统的架构&#xff08;architecture&#xff09;和系统信息。以下是一些常用的命令&#xff1a; 查看系统架构&#xff1a; 使用 uname 命令可以显示系统的架构信息。特别是&#xff0c;使用 -…

Ansible(一)

Ansible: 远程操作主机功能&#xff1a; 自动化运维&#xff08;playbook剧本YAML&#xff09; 是基于Python开发的配置管理应用部署攻具&#xff0c;在自动化运维当中&#xff0c;现在是异军突起 Ansible能批量配置&#xff0c;部署&#xff0c;管理上千台主机&#xff0c…

探索 MajicStudio:一款多功能视频编辑软件

一、产品简介 MajicStudio是一款基于人工智能的图片编辑与设计工具&#xff0c;拥有简洁的界面与丰富功能。采用深度学习和计算机视觉技术可以自动识别图片要素。 二、应用场景 MajicStudio的AI图像功能适用于多场景&#xff0c;包括艺术设计、电商、游戏和文创等场景。 三、…