如何在 C# 中使用 反射

C# 中的 反射 常用于在程序的运行时获取 类型 的元数据,可获取的信息包括已加载到进程中的 程序集类型 信息,它和 C++ 中的 RTTI(Runtime Type Information) 的作用是差不多的。

为了能够使用反射,需要在项目中引用 System.Reflection 命名空间,在使用反射的开始,你会获取一个 Type 类型的对象,从这个对象上进一步获取 程序集,类型,模块 等信息,可以通过 反射 动态的生成某个类型的实例,甚至还能动态调用这个类型上的方法。

System.Reflection 命名空间下,定义了如下几大核心类型。

  • Assembly

  • Module

  • Enum

  • MethodInfo

  • ConstructorInfo

  • MemberInfo

  • ParameterInfo

  • Type

  • FieldInfo

  • EventInfo

  • PropertyInfo

现在我们一起研究一下怎么使用,考虑下面定义的 Customer 类。

public class Customer{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public string Address { get; set; }}

下面的代码片段展示了如何通过 反射 来获取 Customer 的类名以及 Customer 的所属命名空间。

class Program{static void Main(string[] args){Type type = typeof(Customer);Console.WriteLine("Class: " + type.Name);Console.WriteLine("Namespace: " + type.Namespace);}}

再看一个例子,如何通过反射获取 Customer 下的所有属性,并且将属性名字全部展示在控制台上,如下代码所示:

static void Main(string[] args){Type type = typeof(Customer);PropertyInfo[] propertyInfo = type.GetProperties();Console.WriteLine("The list of properties of the Customer class are:--");foreach (PropertyInfo pInfo in propertyInfo){Console.WriteLine(pInfo.Name);}}

值得注意的是,typeof(Customer).GetProperties() 默认只能获取 标记为 public 的属性集合,对应着 Customer 类下的四个公开属性。

接下来再来看看如何通过 反射 获取类型下的 构造函数 和 公共方法 的元数据信息,这里还是继续使用 Customer 类,在类中新增一个 构造函数 和一个 Validate 方法,此方法用于校验入参的合法性,下面就是修改后的 Customer 类。

public class Customer{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public string Address { get; set; }public Customer() { }public bool Validate(Customer customerObj){//Code to validate the customer objectreturn true;}}

然后再来看看通过 反射 来获取 Customer 下所有定义的构造函数,不过这里只定义了一个构造函数,因此只能列出一个。

class Program{static void Main(string[] args){Type type = typeof(Customer);ConstructorInfo[] constructorInfo = type.GetConstructors();Console.WriteLine("The Customer class contains the following Constructors:--");foreach (ConstructorInfo c in constructorInfo){Console.WriteLine(c);}}}

同样也要注意,默认情况下 GetConstructors() 方法只能获取 Customer 的所有标记为 public 的构造函数。

接下来看看如何展示 Customer 中的所有 public 方法,因为该类中只定义了一个 public 方法,所以控制台上也应该只会展示一个,如下代码仅供参考。

static void Main(string[] args){Type type = typeof(Customer);MethodInfo[] methodInfo = type.GetMethods();Console.WriteLine("The methods of the Customer class are:--");foreach (MethodInfo temp in methodInfo){Console.WriteLine(temp.Name);}Console.Read();}

是不是很惊讶,刚才还说是一个方法,居然多了好几个,要知道多的那几个方法,来自于两方面。

  • 从 object 类型继承下来的公共方法

  • 编译器自动生成的属性方法

如果方法上面标记了 Attribute, 还可以通过 GetCustomAttributes 方法来获取,参考代码如下:

static void Main(string[] args){foreach (MethodInfo temp in methodInfo){foreach (Attribute attribute in temp.GetCustomAttributes(true)){//Write your usual code here}}}

相信在你的应用程序中,经常会在 领域实体 上使用各种 Attribute 特性,这时候就可以通过上面的代码反射提取 领域实体 中的方法上的Attribute信息,从而根据提取到的 Attribute 执行你的具体业务逻辑。

译文链接:https://www.infoworld.com/article/3027240/how-to-work-with-reflection-in-c.html

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

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

相关文章

echarts迁徙图 vue_如何快速在Vue中实现流向图或迁徙图?

原标题:如何快速在Vue中实现流向图或迁徙图?我们经常在一些新闻报道和商业杂志上看到运用地图来展示商业现象的做法。这样利用地图来反映和分析数据的形式,叫数据地图,它可以直观的表达出数据之间的空间关系。在数据地图中&#x…

霍纳法树形流图中处理机p个数_2009系统结构试卷答案

一.单项选择题(共10分,每选1分)1.与流水线最大吞吐率高低有关的是(C)A.各个子过程的时间B.最快子过程的时间C.最慢子过程的时间D.最后子过程的时间2.在流水机器中,全局相关是指(D)A.先写后读相关B.先读后写相关C.指令相关D.由转移指令引起的相…

html文件上传添加额外参数,bootstrap-fileinput组件在上传时传递额外参数

解决方法关键的配置参数是uploadExtraData具体的代码如下://获得额外参数的方法fodderType function() {return $("#fodderTypeSelect").val();};//初始化fileinput控件(第一次初始化)function initFileInput(ctrlName, FileExtensions, fileSize) {var …

什么是ASP.NET Core静态Web资产?

What are ASP.NET Core Static Web Assets?HostBuilder.ConfigureWebHostDefaults()中发生了很多隐藏的魔术(最终称为ConfigureWebDefaults)。 我想更好地了解它,因为我找不到有关它的文档。此代码似乎正在加载一些静态文件。什么是静态网络资产,为什么…

计算机基础知识教案1,计算机基础知识教案一

计算机基础知识教案一 秦皇岛外国语职业学院教案首页 年 月 日 学科 计算机基础 年级 专一 课题 计算机基础知识 教具 课时分配 2课时 教学目的 1. 了解计算机的发展、特点和应用 2. 掌握计算机的系统组成 3. 掌握各个逻辑部件性能指标和作用 教学重点、…

C# 9 新特性——init only setter

C# 9 新特性——init only setterIntroC# 9 中新支持了 init 关键字,这是一个特殊的 setter,用来指定只能在对象初始化的时候进行赋值,另外支持构造器简化的写法,Target-typed new expression 在已知类型的情况下可以使用 new() 来…

时间戳计算机网络,时间戳

时间戳(Timestamp)[编辑]什么是时间戳时间戳是指使用数字签名技术对包含原始文件信息、签名参数、签名时间等信息构成的对象进行数字签名而产生的数据,用以证明原始文件在签名时间之前已经存在。通过使用如网络时间协议(NTP)的机制,计算机维系准确的当前…

乔安监控云存储_智能运维丨全栈监控,护航云上业务

自2006年至今,云计算商用领域已经历了十余载的发展。云也从概念普及进入到广泛应用阶段,云服务变成了像水电一样的基础服务,已经是行业共识。云发展速度快、成长空间大,监控场景复杂最新Gartner的报告预测到2019年公有云市场将达到…

阿星Plus:基于abp vNext开源一个博客网站

作为微软最早迈向开源的重要软件之一,.NET 5的发布具有重要意义!微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上,为明年发布的 .NET 6.0 将 Xamarin 开发者过渡到统一平台奠定基础。这里推荐一个.NET Core 3.1 开源的…

html 保存文件指定路径,78.上传文件及在服务器保存文件到任意路径

上传文件到服务器是一个常用的操作,而在服务器上保存文件就需要多多用心了。因为你不可能只在一个路径里保存文件,所以需要实践一下保存文件到任意位置。当然,前提是你的应用程序有这样的操作权限。首先建立一个main.go文件,作为项…

excel表格中添加combobox_Excel中两个表格对比,找出不同数据

当你有两个Excel工作簿需要对比数据时候,你该怎么做呢?数据少,我们直接用眼睛就可以看到,数据如果太多,那么对比找出不同数据,是一件非常困难的事情。今天,小汪老师就来教大家几招,可…

2021,未来可期

一转眼,已经是2021了。这个公众号,也陪伴大家走过了八个月的时光。八个月,35篇原创,坚持写一些能够经受时间考验的文章,也算是一个小小的成就。感慨一下,因为,未来可期!整理了一个目…

quill变html转化,将Quill Delta转换为HTML

这里是我是如何做到的,因为你快速乡亲。它似乎与express-sanitizer一起工作得很好。app.jsimport expressSanitizer from express-sanitizerapp.use(expressSanitizer())app.post(/route, async (req, res) > {const title req.body.article.titleconst content…

【Git】Git-常用命令备忘录(一)

不管是linux还是git,都有相当一部分命令,但是如果不常用,或者久疏战阵,总会有些遗忘。好记性不如烂笔头。美国《科学》杂志刊发了Betsy Sparrow等的科研论文,称Google等搜索引擎模式可能会损害人的大脑记忆力。意思大概…

非抢占式优先算法例题_非抢占短作业优先算法源代码(C语言)

#include #include #define MAX 5 //进程数/*短作业优先算法*/struct pro{int num; //进程名int arriveTime; //到达时间int burst; //运行时间;struct pro *next;};//函数声明struct pro* creatList();void insert(struct pro *head,struct pro *s);struct pro* searchByAT(st…

计算机算法音乐专业,音乐信号分析算法的乐理简说(非音乐专业的乐理)

前言这篇文章不是讲乐理知识的,那是音乐制作人,编曲人员所需要钻研的学问,不过你要有兴趣也可以看看专业的乐理知识。这里仅仅是说在音乐信号分析的项目中,我们需要知道的一些参数的意义。在诸多信号处理,或图像处理算…

代码改变世界,也改变了我

愿2021的你,可以勇敢的踏出那一步,可以去追求自己想要的东西。脑图版代码版using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp14 {internal class Program{pr…

计算机基础与应用教程计算机硬件,计算机基础系列一:计算机硬件

1、编程语言的作用及与操作系统和硬件的关系一个完整的计算机系统包括硬件、操作系统、软件(即程序员开发的各种软件)三部分组成。各程序员开发的软件若直接调用计算机的硬件,如硬盘读取、音频播放等,则软件不仅编写复杂同时影响开发效率,因此…

宝塔mysql远程链接_宝塔apache启动失败:报错 AH00526: Syntax error on line 解决方案

错误信息:AH00526: Syntax error on line 54 of /www/server/apache/conf/httpd.conf:Cannot define multiple Listeners on the same IP:port朋友网站突然访问不了,进入宝塔后查看Apache服务器没运行,重启Apache时提示这个错误信息打开Apach…