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

如何在 C# 中使用 反射相关推荐

  1. 来看看如何在 C# 中使用反射

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

  2. java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...

    在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...

  3. formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化

    今天来聊聊java中的反射机制,工作以后发现很多东西动不动就要使用反射或者动态代理,如果不能很好的理解反射,那么对于动态代理等一些重要的设计模式就会有种不够通透的感觉. 所谓的反射,就是在运行状态中, ...

  4. java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...

    如何在Java 中使用泛型或反射机制对DAO进行抽象 发布时间:2020-11-26 16:07:42 来源:亿速云 阅读:80 作者:Leah 本篇文章为大家展示了如何在Java 中使用泛型或反射机 ...

  5. figma下载_如何在Figma中创建逼真的3D对象

    figma下载 by Gbolahan Taoheed Fawale 通过Gbolahan Taoheed Fawale 如何在Figma中创建逼真的3D对象 (How to create reali ...

  6. 15.立体几何——介绍,为什么多个视图,深度和形状线索 测验,人类如何在3D中看到东西_1

    目录 介绍 为什么多个视图 深度和形状线索 测验 人类如何在3D中看到东西 介绍 今天,我们将开始谈论立体,这个特别讲座是关于立体几何的. 一般来说,接下来的几个文章将是关于相机几何和场景几何之间的关 ...

  7. 如何在Go中找到一个对象的类型?

    本文翻译自:How to find a type of an object in Go? How do I find the type of an object in Go? 如何在Go中找到对象的类 ...

  8. 如何在UE5中重建哥特式建筑场景?

    今天给大家分享如何在UE5中重建哥特式建筑场景?一起来看下吧! 1.介绍 哥特式建筑是我最喜欢的风格之一,所以就想用模组化构建一个哥特风格场景,闲言少叙,直接上图! 本次教程会从找参考到制作模组.纹理 ...

  9. Lightroom Classic 教程:如何在 Lightroom 中调整高光和阴影?

    欢迎观看 Lightroom Classic 教程,小编带大家学习 Lightroom Classic 的基本工具和使用技巧,了解如何在 Lightroom 中调整高光和阴影. 有时会发现,使用曝光度 ...

最新文章

  1. 我在 GitHub 上看到了一个丧心病狂的开源项目!治好了我的拖延症
  2. pandas使用iloc函数基于dataframe数据列的索引抽取单列或者多列数据、其中多列索引需要嵌入在列表方括号[]中、或使用:符号形成起始和终止范围索引
  3. Redis报错解决The TCP backlog setting of 511 cannot be enforced和This will create latency and memory usage
  4. biopython有什么用_BioPython学习笔记
  5. 比特币交易平台 php,比特币PHP离线交易开发包
  6. boost::gil::pixels_are_compatible用法的测试程序
  7. 通过rpm包安装、配置及卸载mysql的详细过程.
  8. TensorFlow实验(1)
  9. 新手也能看懂的 SpringBoot 异步编程指南
  10. 安卓应用安全指南 4.1.1 创建/使用活动 示例代码
  11. TortoiseGit(Windows)使用方法汇总
  12. linux系统中连接两个网桥,Linux 网桥代码分析 (二)
  13. 上亿只“小白鼠”有救了,AI可检测化学物质甚至还更准确
  14. 走向.NET架构设计—第三章—分层设计,初涉架构(后篇)
  15. 【Python】伪距单点定位
  16. 计算机科学概论课程设计:Technology in the field of artificial intelligence
  17. 抓取图片拼接成全景图
  18. 1025 反转链表 (25 分)
  19. 如何在MySQL中实现替换字段部分内容
  20. 华为OD开发岗面试记录

热门文章

  1. oo面向对象第一单元总结
  2. 【概率论】1-2:计数方法(Counting Methods)
  3. 指定时间的月初和月末一天的写法
  4. Xcode 8 GM 编译缺失 /Users/usr/lib/libresolv.9.dylib
  5. SpringMVC总结帖
  6. .net Repeater知识知多少
  7. linux去掉某一字符开头的行
  8. python图片内容长度识别_Python实现识别图片内容的方法分析
  9. windows变量延迟_Windows 10的2018年10月更新可能推迟到11月(这就是原因)
  10. 阿里云MaxCompute香港开服 将引入更多人工智能服务