【.NET Core】反射(Reflection)详解(二)
【.NET Core】反射(Reflection)详解(二)
文章目录
- 【.NET Core】反射(Reflection)详解(二)
- 一、概述
- 二、Type类
- 2.1 Type对象表示哪些类型
- 2.2 获取Type及其关联对象类型的方式
- 2.3 Type.FilterName字段
- 2.4 Type.FilterNameIgnoreCase字段
- 2.5 Type.Assembly属性
- 2.6 Type.BaseType属性
- 2.7 Type.FullName属性
- 2.8 Type.Module属性
- 2.9 Type.Namespace属性
- 2.10 Type.FindMembers方法
- 2.11 Type.GetConstructor方法
- 2.12 Type.GetField 方法
- 2.13 Type.GetMember方法
- 2.14 Type.GetMethod 方法
- 2.15 Type.GetProperty 方法
- 2.16 Type.InvokeMember方法
- 二、总结
一、概述
反射提供了对已封装的程序集、模型和类型的对象一种动态访问方法。反射包含动态加载程序集的Assembly类、程序集中模块访问的Module类、对类信息Type类、构造函数信息ConstructorInfo类、方法信息MethodInfo类、字段信息FieldInfo类、事件信息EventInfo类、属性信息PropertyInfo类、参数信息ParameterInfo类。博文《反射(Reflection)详解(一)》已详细讲解了Assembly类、Module类的用法。本章将重点讲解Type类
二、Type类
Type类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义以及开发或封闭构造的泛型类型。
Type是功能的根类。System.Relection是访问元数据的主要方式。使用的成员Type获取有关类型声明、类型的构造函数、方法、字段、属性和事件以及在其中部署类的模块和程序集。Type无需任何权限即可通过反射获取有关类型及其成员信息。
2.1 Type对象表示哪些类型
此类是线程安全的,多个线程可以并发读取此类型的实例。类Type实例可以表示以下任一类型:
- 类
- 值类型
- 数组
- 接口
- 枚举
- 委托
- 构造泛型类型和泛型类型定义
- 构造泛型类型、泛型类型定义和泛型方法定义的类型参数和类型参数
2.2 获取Type及其关联对象类型的方式
-
实例化对象通过Object.GetType方法返回一个Type对象,该对象表示实例化类型。由于Object是所有托管类型的基类,因此任何类型的实例都可以调用GetType方法。
StringHelper stringHelper= new StringHelper(); Type type= typeof(StringHelper); String str = new String("abdce") Type type1 = str.GetType(); -
静态typeof()返回一个Type对象,该对象表示由其完全限定名称指定的类型。
Type typeHelper= typeof(StringHelper); Type typeString = typeof(String);
2.3 Type.FilterName字段
表示用于名称的区分大小写的成员筛选器,此字段为只读。此字段对方法使用的委托的FindMembers引用。此委托封装的方法采用两个参数:第一个MemberInfo是对象,第二个Object是确定匹配条件。Object分配了一个字符串值,可使用通配符(*),这个通配符仅支持结束字符串匹配。
Type typeHelper = typeof(StringHelper);
MemberInfo[] members = typeHelper.FindMembers(MemberTypes.Constructor|MemberTypes.Method,BindingFlags.Public |BindingFlags.Static |BindingFlags.NonPublic |BindingFlags.Instance |BindingFlags.DeclaredOnly,Type.FilterName, "GetStr*");
2.4 Type.FilterNameIgnoreCase字段
表示用于名称的不区分大小写的成员筛选器。此字段为只读。此字段对方法使用的委托的FindMembers引用。此委托封装的方法采用两个参数:第一个MemberInfo是对象,第二个Object是MemberInfo与指定的Object条件是否匹配。Object与Type.FilterName一样,分配了一个统配了一个字符串值,其中可包含结尾通配符(*);
Type typeHelper = typeof(StringHelper);
MemberInfo[] members = typeHelper.FindMembers(MemberTypes.Constructor|MemberTypes.Method,BindingFlags.Public |BindingFlags.Static |BindingFlags.NonPublic |BindingFlags.Instance |BindingFlags.DeclaredOnly,Type.FilterName, "getstr*");
2.5 Type.Assembly属性
获取在其中声明该类型的Assembly,对于泛型类型、则获取在其中定义该泛型类型的Assembly。
Type typeHelper = typeof(StringHelper);
Console.WriteLine($"Assembly full name:{typeHelper.Assembly.FullName}");
Console.WriteLine($"Assembly QualifiedName:{typeHelper.Assembly.AssemblyQualifiedName}");
2.6 Type.BaseType属性
获取当前Type直接从中继承的类型。
Type t = typeof(int);
Console.WriteLine($"int inherits from {t.BaseType}");
2.7 Type.FullName属性
获取当前Type的名称,包含namespace但是不包含Assembly
Type t = typeof(int);
Console.WriteLine($"int inherits from {t.FullName}");
2.8 Type.Module属性
获取在其中定义当前Type的模块(DLL)
Type typeHelper = typeof(int);
Console.WriteLine($"Module QualifiedName:{typeHelper.Module.FullyQualifiedName}");
显示内容
Module QualifiedName:C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.3\System.Private.CoreLib.dll
2.9 Type.Namespace属性
获取当前命名空间,如果当前Type没有命名空间或表示泛型的参数,则为空。
Type typeHelper = typeof(int);
Console.WriteLine($"The Namespace:{type.Namespace}");
2.10 Type.FindMembers方法
返回指定成员类型的MemberInfo对象的筛选数组。
参数MemberTypes
| 名 | 值 | 说明 |
|---|---|---|
| Construsctor | 1 | 指定成员是构造函数 |
| Custom | 64 | 指定成员为自定义成员类型 |
| All | 191 | 指定所有的成员类型 |
| Event | 2 | 指定成员为事件 |
| Field | 4 | 指定成员为字段 |
| Method | 8 | 指定成员为方法 |
| NestedType | 128 | 指定成员为嵌套类型 |
| Property | 16 | 指定成员为属性 |
| TypeInfo | 32 | 指定成员为Type |
2.11 Type.GetConstructor方法
用指定绑定约束和指定调用约束,搜索其参数与指定参数类型及修饰符匹配的构造函数。
public System.Reflection.ConstructorInfo? GetConstructor (System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, System.Reflection.CallingConventions callConvention, Type[] types, System.Reflection.ParameterModifier[]? modifiers);
参数
bindingAttr BindingFlags
枚举值的按位组合,这些值指定如何进行搜索 BindingFlags枚举参考
binder Binder
一个对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法,强制参数类型和通过反射调用成员。
callConvention CallingConventions
对象,用于指定要使用的一套规则,这些规则涉及参数的顺序和布局、传递返回值的方式,用于参数的寄存器和清理堆栈的方式。
type Type[]
Type对象的数组,表示构造函数要获取的参数的个数,顺序和类型。
modifiers ParameterModifier[]
ParameterModifier对象的数组,表示与types数组中的相应元素关联的特性。
返回
ConstructorInfo
表示符合指定需求的构造函数的对象;否则为null
2.12 Type.GetField 方法
获取当前Type的特定字段
GetField(String) : 搜索具有指定名称的公共字段。
GetField(String,BindingFlags) : 使用指定绑定约束搜索指定字段。
Type myTypeA = typeof(MyFieldClassA);
FieldInfo myFieldInfo = myTypeA.GetField("Field");
2.13 Type.GetMember方法
获取当前类型的指定成员。
GetMember(String) : 搜索具有指定名称的公共成员
GetMember(String,BindingFlags) : 使用指定的绑定约束搜索指定成员
GetMember(String,MemberTypes,BindingFlags) : 使用指定的绑定约束搜索指定成员类型的指定成员。
String myString = "GetMember_String";
Type myType = myString.GetType();
MemberInfo[] myMembers = myType.GetMember("C*");
2.14 Type.GetMethod 方法
获取当前Type的特定方法。
GetMethod(String,Int32,BindingFlags,Binder,CallingConventions,Type[],ParameterModifier[])
使用指定的绑定约束和指定的调用约定搜索其参数与指定泛型参数计数、参数类型及修饰符匹配的指定方法。
GetMethod(String, BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])
用指定的绑定约束和指定的调用约定,搜索参数与指定的参数类型及修饰符相匹配的指定方法。
GetMethod(String,Int32,BindingFlags,Binderm,Type[],ParameterModifier[])
使用指定绑定约束,搜索其参数与指定泛型参数计数、参数类型及修饰符匹配的指定方法。
GetMethod(String)
搜索具有指定名称的公共方法
StringHelper stringHelper = new StringHelper();
Type type = typeof(StringHelper);
var methodInfos = type.GetMethods(BindingFlags.Instance | BindingFlags.Public);
MethodInfo methodInfo= methodInfos?.First();
Console.WriteLine($"The methodInfo :{methodInfo.Name}");
2.15 Type.GetProperty 方法
获取当前Type的特定属性。
-
GetProperty(String,Type,Type[])
搜索其参数与指定自变量类型匹配的指定公共属性。
-
GetProperty(String,BindingFlags,Binder,Type,Type[],ParameterModifier[])
使用指定的绑定约束,搜索参数与指定的自变量类型及修饰符匹配的指定属性。
-
GetProperty(String,Type,Type[],ParameterModifier[])
搜索其参数与指定自变量类型及修饰符匹配的指定公共属性
-
GetProperty(String,Type[])
搜索其参数与指定自变量类型匹配的指定公共属性
-
GetProperty(String,Type)
搜索具有指定名称和返回类型的公共属性
-
GetProperty(String)
搜索具有指定名称的公共属性
2.16 Type.InvokeMember方法
调用当前Type的特定成员。
-
InvokeMember(String,BindingFlags,Binder,Object,Object[])
使用指定的绑定约束并匹配指定的参数列表,调用指定成员。
-
InvokeMember(String,BindingFlags,Binder,Object,Object[],CultureInfo)
使用指定的绑定约束和匹配的指定参数列表及区域性来调用指定成员。
-
InvokeMember(String,BindingFlags,Binder,Object,Object[],ParameterModifier,CultureInfo,String)
当在派生类中重写时,使用指定的绑定约束并匹配指定的参数列表、修饰符和区域性,调用指定成员。
参数
name String
字符串,它包含要调用的构造函数、方法、属性或字段成员的名称。或空字符串(“”),表示调用默认成员。
invokeAttr BindingFlags
枚举值的按位组合,这些值指定如何进行搜索。访问可以是BindingFlags之一。如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。 查找类型无需指定。 如果省略查找的类型,则将使用 BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static。
binder Binder
一个对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。
target Object
对其调用指定成员的对象。
args Object[]
包含传递给要调用的成员的参数数组。
StringHelper stringHelper = new StringHelper();
Type type = typeof(StringHelper);
Object obj = type .InvokeMember(null,BindingFlags.DeclaredOnly |BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);
var methodInfos = type.GetMethod("RemoveLastChar");object response = type.InvokeMember("RemoveLastChar", BindingFlags.DeclaredOnly |BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, new Object[] { "This is ,水电费," ,","});Console.WriteLine($"The methodInfo :{response}");
二、总结
System.Type类是一个抽象的基类,实例化Type对象,其实就是实例化Type的一个派生类。Type是许多反射功能的入口。
相关文章:
【.NET Core】反射(Reflection)详解(二)
【.NET Core】反射(Reflection)详解(二) 文章目录 【.NET Core】反射(Reflection)详解(二)一、概述二、Type类2.1 Type对象表示哪些类型2.2 获取Type及其关联对象类型的方式2.3 Type…...
【错误记录/js】保存octet-stream为文件后数据错乱
目录 说在前面场景解决方式其他 说在前面 后端:go、gin浏览器:Microsoft Edge 120.0.2210.77 (正式版本) (64 位) 场景 前端通过点击按钮来下载一些文件,但是文件内容是一些非文件形式存储的二进制数据。 后端代码 r : gin.Default()r.Stat…...
sql_lab之sqli中的post注入
Post注入 用burpsuit抓包去做 Post第一关:(gxa5) 1.判断是否存在注入 username1or 11 #&password123&submit%E7%99%BB%E5%BD%95 有回显 username1or 12 #&password123&submit%E7%99%BB%E5%BD%95 没有回显 则证明存在sq…...
智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白冠鸡算法4.实验参数设定5.算法结果6.参考文…...
DETR++: Taming Your Multi-Scale Detection Transformer论文解读
文章目录 前言一、摘要二、引言三、相关研究四、模型方法1、Removing the Encoder方法2、Multi-Head方法3、Shifted Windows方法4、Bi-directional Feature Pyramid方法5、DETR方法 五、实验结果总结 前言 今天查看了一篇DETR论文,本想网络上找博客大概浏览一下&am…...
高级数据结构 <二叉搜索树>
本文已收录至《数据结构(C/C语言)》专栏! 作者:ARMCSKGT 目录 前言正文二叉搜索树的概念二叉搜索树的基本功能实现二叉搜索树的基本框架插入节点删除节点查找函数中序遍历函数析构函数和销毁函数(后序遍历销毁)拷贝构造和赋值重载(前序遍历创建)其他函数…...
蚂蚁集团5大开源项目获开放原子 “2023快速成长开源项目”
12月16日,在开放原子开源基金会主办的“2023开放原子开发者大会”上,蚂蚁集团主导开源的图数据库TuGraph、时序数据库CeresDB、隐私计算框架隐语SecretFlow、前端框架OpenSumi、数据域大模型开源框架DB-GPT入选“2023快速成长开源项目”。 (图…...
SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)
场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…...
气压计LPS28DFW开发(2)----水压检测
气压计LPS28DFW开发.2--水压检测 概述视频教学样品申请完整代码下载水压计算设置速率和分辨率轮询读取数据测试结果 概述 本文将介绍如何使用 LPS28DFW 传感器来读取的压强数据,来估算水下深度,可以利用液体静压的原理。 最近在弄ST和瑞萨RA的课程&…...
设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景
系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用…...
计算机网络个人小结
不同层的数据报的名称 应用层: data TCP层: segment IP 层: packet MAC层: frame MTU vs MSS: MTU:一个网络包的最大长度,以太网中一般为 1500 字节。 https://www.xiaolincoding.com/network/1_base/how_os_deal_network_package.html#linux-%E7%BD%91…...
酒店网站搭建的作用是什么
线上已经成为各行业商家增长破局的必要手段,传统酒店行业因信息扩展度不够,导致品牌难以传播、无法实现用户对酒店所有信息全面知悉,也无法实现在线预约及其它赋能用户消费的路径。 面对获客转化难题,很多酒店商家通过建立自营商…...
俄罗斯联邦税务局遭乌克兰入侵,数据库和副本被清空,政府数据安全不容忽视
俄罗斯联邦税务局遭乌克兰入侵,数据库和副本被清空,政府数据安全不容忽视 据相关报道,2023年12月12日,乌克兰国防情报局(GUR)称其成功入侵了俄罗斯联邦税务局(FNS)系统,并清除了该机构的数据库和…...
WPF组合控件TreeView+DataGrid之TreeView封装
(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…...
redisson 哨兵模式配置
背景:项目redis由集群改为哨兵模式,漏洞扫描未授权访问漏洞(CNVD-2019-21763),要求对redis哨兵也设置密码,redisson依赖版本为3.11.5 spring-boot版本为2.1.13。 redisson依赖升级 <dependency>&l…...
免费的ChatGPT分享
免费的ChatGPT 以下是一些免费的ChatGPT平台和工具: 零声教学AI助手 零声教育内部使用的ChatGPT,提供智能对话和问题解答功能。 Ora.ai 一个可以自定义的AI聊天机器人,可以根据个人需求进行定制和训练。 ChatGPT 人工智能聊天机器人&a…...
C语言—每日选择题—Day54
指针相关博客 打响指针的第一枪:指针家族-CSDN博客 深入理解:指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 存在int类型变量x,y,z,其对应值为x0x59,y0x39,z0x6E,则x * y z的值…...
先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代
在新一轮科技革命和产业变革的推动下,制造业正面临绿色化、智能化、服务化和定制化发展趋势。为顺应新技术革命及工业发展模式变化趋势,传统工业化理论需要进行修正和创新。其中,对工业化水平的判断标准从以三次产业比重标准为主回归到工业技…...
【密码学引论】密码协议
定义:两个或者两个以上参与者为了完成某一特定任务而采取的一系列执行步骤密码协议:Kerberos、IPSec、SSL、SET算法是低层次上的概念,而协议是高层次上的概念,协议建立在算法的基础上。所有密码协议都容易受中间人攻击,…...
利用快手的用户数据和精准营销提升电商平台用户转化率和销售额
一、快手用户数据的价值 快手作为国内领先的短视频平台,拥有庞大的用户群体和丰富的用户行为数据。这些数据包括用户的观看习惯、互动行为、兴趣偏好等,对于电商平台来说具有极高的商业价值。通过分析这些数据,电商平台可以深入了解用户需求…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
