C#反射实用技术笔记

简介:

  反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。

  程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。反射通常具有以下用途:

  • 使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

  • 使用 Module 了解如下的类似信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

  • 使用 ConstructorInfo 了解以下信息:构造函数的名称、参数、访问修饰符(如 publicprivate)和实现详细信息(如 abstractvirtual)等。使用 TypeGetConstructorsGetConstructor 方法来调用特定的构造函数。

  • 使用 MethodInfo 了解以下信息:方法的名称、返回类型、参数、访问修饰符(如 publicprivate)和实现详细信息(如 abstractvirtual)等。使用 TypeGetMethodsGetMethod 方法来调用特定的方法。

  • 使用 FieldInfo 了解以下信息:字段的名称、访问修饰符(如 publicprivate)和实现详细信息(如 static)等;并获取或设置字段值。

  • 使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。

  • 使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

  • 使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

  • 当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来了解有关自定义属性的信息。使用 CustomAttributeData,您不必创建属性的实例就可以检查它们。

   System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时构造类型。

  反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。

  反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。

  —— MSDN 反射(C#) 反射概述

  1. 动态加载程序集

  我们可以通过程序集的文件名来加载一个程序集。

Assembly libAssembly = Assembly.Load("Lib.Entity");

  在得到程序集之后,我们可以得到一个或所有这个程序集下的类型。

  2. 获取程序集下的类型

  如果我们知道一个类的全称(包括命名空间),可以通过下面的方法获取到这个类的类型:

Type bookType = libAssembly.GetType("Lib.Entity.Book");

  或者,我们可以得到这个程序集下的所有类型:

Type[] allTypes = libAssembly.GetTypes();

  3. 动态创建类型的实例

  在得到类型以后,可以根据类型来创建类型的实例:

Lib.Entity.Book book = Activator.CreateInstance(bookType) as Lib.Entity.Book;

  其实当我们知道一个类型以后,动态的创建一个实例是很不合理的,个人认为这里可以用来实例化一个接口或者子类,对于IOC(控制反转)比较有用。例如:

IBook bk = Activator.CreateInstance(bookType) as Lib.Entity.Book;

  4. 调用类型的方法

  在实例化该类型以后,可以通过调用该类型的方法:

MethodInfo method = bookType.GetMethod("GetBookString", BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic);
output(method.Invoke(book, null).ToString());

  通过GetMethod方法,配合后面的绑定标识,不仅可以获取公共方法,还可以获取私有和受保护的方法、静态方法,并调用它们。

  5. 访问字段和属性

  我们可以通过类型的GetProperty方法获取属性信息:

PropertyInfo info = bookType.GetProperty("Title");

  还可以为该属性赋值:

info.SetValue(book, value, null);

  字段的访问与之相似。

  这种访问字段和属性的技术常被用作ORM中。

  6. 访问Attribute

  这个Attribute是对类型、方法或字段的修饰。如果存在,我们可以在运行时获取到。

bookType.GetCustomAttributes(false);

  该技术和上一个相配合,常用来实现一个ORM框架。




本文转自齐师傅博客园博客,原文链接:http://www.cnblogs.com/youring2/archive/2012/04/27/2473680.html,如需转载请自行联系原作者

相关文章
|
人工智能 运维 算法
基于 C# 深度优先搜索算法的局域网集中管理软件技术剖析
现代化办公环境中,局域网集中管理软件是保障企业网络高效运行、实现资源合理分配以及强化信息安全管控的核心工具。此类软件需应对复杂的网络拓扑结构、海量的设备信息及多样化的用户操作,而数据结构与算法正是支撑其强大功能的基石。本文将深入剖析深度优先搜索(Depth-First Search,DFS)算法,并结合 C# 语言特性,详细阐述其在局域网集中管理软件中的应用与实现。
290 3
|
缓存 监控 算法
基于 C# 网络套接字算法的局域网实时监控技术探究
在数字化办公与网络安全需求增长的背景下,局域网实时监控成为企业管理和安全防护的关键。本文介绍C#网络套接字算法在局域网实时监控中的应用,涵盖套接字创建、绑定监听、连接建立和数据传输等操作,并通过代码示例展示其实现方式。服务端和客户端通过套接字进行屏幕截图等数据的实时传输,保障网络稳定与信息安全。同时,文章探讨了算法的优缺点及优化方向,如异步编程、数据压缩与缓存、错误处理与重传机制,以提升系统性能。
349 2
|
Web App开发 Linux C#
C# 网页截图全攻略:三种技术与 Chrome 路径查找指南
本文主要介绍了在 C# 中实现网页截图的几种技术及相关要点。涵盖了 PuppeteerSharp、Selenium 和 HtmlToImage 三种方式,分别阐述了它们的安装步骤及核心代码。同时,针对在 C# 中寻找 Windows 上 chrome.exe 路径这一问题,分析了未安装 Google Chrome 和已安装两种情况下的查找原因,并给出了相关参考链接,还列举了一系列与 C# 使用 Selenium、获取 chrome.exe 路径以及在 Linux 上部署相关的参考资料。
582 11
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
608 0
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
310 6
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
351 6
|
程序员 C# 数据库
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
307 5
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
207 3
|
人工智能 开发框架 Cloud Native
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
241 1
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
253 0