【.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) :检索应用于指定成员的指定类型的自定义特性,并可选择检查该成员的上级
四、总结
本文讲解反射中常用的使用类Assembly及Module类,及如何将程序集通过反射获取对应的信息,下一篇将注重讲解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
相关文章:
【.NET Core】反射(Reflection)详解(一)
【.NET Core】反射(Reflection)详解(一) 文章目录 【.NET Core】反射(Reflection)详解(一)一、什么是反射二、Assembly类2.1 LoadFile2.2 Load2.3 LoadFrom(String)2.4 GetName()2.5…...
jenkins入门
文章目录 前言一、 jenkins的安装二、新建简单任务总结 前言 本篇文章是 jenkins 的入门级别案例,包括安装、基础概念介绍、新建简单任务 一、 jenkins的安装 下载 jenkins https://www.jenkins.io/download/ 当前案例下载的是 2.426.2 LTS 版本 下载安装jdk11 …...
HarmonyOS --- 首页(新新新手版,高手误入)
一、前言 每一个App都应该有一个首页,在Android中一般由MainActivity Navigation Fragment * N (随便你怎么组合,用别的也一样),鸿蒙呢?瞅瞅吧。阿弥陀佛,苦逼Android学完Java学Dart、学完Da…...
springboot升级到3.2导致mybatis-plus启动报错
在springboot升级到3.2时,服务启动报错 java.lang.IllegalArgumentException: Invalid value type for attribute ‘factoryBeanObjectType’: java.lang.String: java.lang.IllegalArgumentException: Invalid value type for attribute factoryBeanOb…...
浏览器原理篇—渲染原理
目录导航 为什么要学习浏览器的渲染原理浏览器的渲染流程浏览器的渲染阻塞浏览器的渲染优化 为什么要学习浏览器的渲染原理? 知识深度挖掘: 帮助更好地理解前端性能优化。从而对实现效果进行针对性优化。如:**回流和重绘 **渲染机制。帮助…...
idea安装
mac安装路径 /Users/xxx/Library/Application Support/JetBrains/IntelliJIdeaxxx版本 将路径内文件直接复制到新版本即可, 注意如果为破解版idea.vmoptions配置中的内容是否添加或删除 maven配置如果使用idea, 需要在应用程序IntelliJ IDEA.app中显示包内容, /Applications/I…...
用Flask搭建简单的web模型部署服务
目录结构如下: 分类模型web部署 classification.py import os import cv2 import numpy as np import onnxruntime from flask import Flask, render_template, request, jsonifyapp Flask(__name__)onnx_session onnxruntime.InferenceSession("mobilen…...
PCL 点云匹配 3 之 (非线性迭代点云匹配)lM-ICP
一、IM迭代法 PCL IterativeClosestPointNonLinear 非线性L-M迭代法-CSDN博客 Matlab 非线性迭代法(3)阻尼牛顿法 L-M-CSDN博客 MATLAB实现最小二乘法_matlab最小二乘法-CSDN博客...
【C语言】SCU安全项目2-BufBomb
目录 关键代码解读: getxs() getbuf() test() 核心思路 具体操作1 具体操作2 前段时间忙于强网杯、英语4级和一些其他支线,有点摸不清头绪了,特别是qwb只有一个输出,太过坐牢,决定这个安全项目做完后就继续投身…...
C++第一讲之初入C++
注:本文是对于学完C语言再学C同学的讲解,主要补充C与C语言不同之处,如果你没学过C语言,不建议观看本文。 一.C简介 我们都知道C语言是过程性语言(强调的是实现过程),即对计算机语言要处理的两…...
如何实现公网访问本地内网搭建的WBO白板远程协作办公【内网穿透】
最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cp…...
js知识点1:防抖节流
js知识点1:防抖节流 防抖节流 防抖节流,本质上是优化高频率执行代码的一种手段 定义: 防抖: n 秒后再执行该事件,若在 n 秒内被重复触发,则重新计时 节流: n 秒内只运行一次,若在 n 秒内重复触发࿰…...
虚拟机下Ubuntu上网设置
文章目录 一、虚拟机上网的两种方式1.1 NAT模式(Network Address Translation)1.2 桥接模式(Bridge Mode)1.3 简介 二、实际配置2.1 NAT模式配置2.2 桥接模式配置 之前跟着博客配了好几个也没用,后来自己慢慢模式实践测…...
Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)
前言 在开发UI滚动列表的时候,经常会有每项的背景图不统一的情况,会间隔重复的情况居多。这种情况下,手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下,笔者尝试写个小工具,在搭建UI时配置一下循环背景的…...
【微服务】服务间调用
当我们的应用从一个大单体拆分成多个微服务之后,服务间调用有多少种方式?服务间调用如果出现超时,如果避免雪崩,即如何做限流熔断机制,原理是什么? 服务间调用方式 OpenFeign 使用Feign进行服务间调用,我们会在启动类加@EnableFeignClients启用。 package org.sprin…...
一句话分清C/C++声明和定义
定义告诉编译器在在哪个位置存储变量,声明没有 声明:告诉编译器,变量类型和名字 定义:告诉编译器变量存储的位置。 举例子 int i; // 这是声明定义。声明:告诉编译器变量类型int,变量名字i, // 定义&…...
《哥德尔证明》阅读笔记——初等命题逻辑的一致性证明过程
前言 前两节主要阐述了公理系统的发展历史,一致性问题的提出,以及希尔伯特的洞见,本节将给出哥德尔证明所需的最后一次具体背景阐述,包含两个问题:一是罗素所著的《数学原理》是为何而写?二是从数学原理中…...
迪文屏开发保姆级教程—弹出键盘录入ASCII字符
本篇文章主要介绍了在DGBUS平台上使用文本录入键盘录入ASCII字符,数字和字母的教程。 文本录入键盘支持录入ASCII字符,数字和字母。 官方开发指南PDF:(不方便下载的私聊我发给你) https://download.csdn.net/download…...
Java,处理字符串的案例()
场景 为了得到一个都是英雄名字的字符数组,需要对如下字符串进行处理 疾风剑豪,影流之主,封魔剑魂,暗裔剑魔,无极剑圣,无双剑姬,武器大师,德邦总管,蛮族之王࿰…...
微信小程序更新机制
1/同步更新 1、定期检查更新时; 2、长期未使用,首次进入会同步更新,但在弱网或者下载新版本失败的情况下,还会使用旧版本。 2/异步更新: 启动时异步更新 3/开发者手动触发更新 在启动时异步更新的情况下,…...
安卓蓝牙开发避坑指南:Bluedroid初始化流程中的5个关键细节
安卓蓝牙开发避坑指南:Bluedroid初始化流程中的5个关键细节 在安卓蓝牙协议栈开发中,Bluedroid的初始化流程是系统与蓝牙硬件建立通信的基础桥梁。许多看似随机的蓝牙功能异常,往往源于初始化阶段某些参数的微妙配置差异。本文将深入剖析五个…...
从零构建:基于FreeRTOS与LVGL的低功耗智能手表实战指南
1. 项目背景与核心目标 第一次接触智能手表开发是在三年前,当时市面上开源的方案要么功能简陋,要么功耗高得离谱。作为一个嵌入式老鸟,我决定自己动手搞一套真正可用的低功耗方案。经过多次迭代,最终选择了FreeRTOSLVGL这个黄金组…...
避坑指南:解决Livox Mid-360双雷达点云融合时坐标系错乱与IMU数据混杂问题
Livox Mid-360双雷达点云融合实战:坐标系校准与IMU数据分离全解析 当你在RViz中看到两个Livox Mid-360雷达的点云像醉酒的水母一样随机飘动,而IMU数据又像被搅拌机混合过的果汁——恭喜你,遇到了多传感器融合的经典难题。这不是简单的参数调整…...
FanControl:颠覆式开源风扇控制工具的全方位应用指南
FanControl:颠覆式开源风扇控制工具的全方位应用指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/…...
Ollama平台部署GLM-4.7-Flash:从零开始搭建本地大模型服务
Ollama平台部署GLM-4.7-Flash:从零开始搭建本地大模型服务 1. 为什么选择GLM-4.7-Flash? 在众多开源大模型中,GLM-4.7-Flash以其独特的定位脱颖而出。这个30B参数的MoE(混合专家)模型,在性能与效率之间取…...
Kazam vs OBS:Ubuntu 24.04 屏幕录制工具对比与选择指南
Kazam vs OBS:Ubuntu 24.04 屏幕录制工具深度评测与实战选择 在数字内容创作爆发的时代,屏幕录制已成为游戏实况、在线教学、产品演示的标配技能。对于Ubuntu 24.04用户而言,Kazam和OBS Studio这两款开源工具常被拿来比较——前者以轻量简洁著…...
Dexter深度解析:如何用多Agent架构打造自主金融研究AI
一、为什么需要金融AI Agent? 1.1 传统金融研究的痛点 作为开发者,你是否遇到过这样的场景:需要分析一家上市公司的财务状况,却要花费数小时甚至数天时间? 传统金融研究面临三大挑战: 数据分散:…...
Flink技术实践-超时异常踩坑与优化
一、背景介绍在Flink实时计算的生产环境中,最令人头疼的往往不是复杂的业务逻辑,而是那些突如其来的“超时异常”。这些异常就像是系统中的“幽灵”,通常在业务高峰期或网络抖动时出现,导致作业重启、数据延迟甚至数据丢失。最近几…...
IntelliJ Conf:JetBrains Koog Java原生AI Agent框架实战
文章目录前言:Java程序员的"Agent焦虑"终于有解了认识Koog:不是又一个LangChain的Java版环境准备:5分钟让项目跑起来实战:从Hello World到智能客服第一步:定义工具(Tool)第二步&#…...
制造业生产管理应用搭建指南:轻流无代码平台完整实施流程——生产效率提升 300% 方法论
制造业生产管理应用搭建指南:轻流无代码平台完整实施流程——生产效率提升 300% 方法论制造业生产管理应用搭建指南:轻流无代码平台完整实施流程——生产效率提升 300% 方法论引言:背景与重要性工信部《智能制造发展规划》明确提出࿰…...
