C#反射实用技术笔记

简介:

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

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

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

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

  • 使用 ConstructorInfo 了解以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的GetConstructors 或 GetConstructor 方法来调用特定的构造函数。

  • 使用 MethodInfo 了解以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的GetMethods 或 GetMethod 方法来调用特定的方法。

  • 使用 FieldInfo 了解以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 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
目录
相关文章
|
13天前
|
数据采集 C# 数据安全/隐私保护
掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容
本文介绍了如何使用C#的HttpClient与爬虫代理IP技术抓取今日头条内容,以实现高效的数据采集。通过结合亿牛云爬虫代理,可以绕过IP限制,增强匿名性。文中提供了一个代码示例,展示如何设置代理服务器信息、请求头,并用正则表达式提取热点新闻标题。利用多线程技术,能提升爬虫采集效率,为市场分析等应用提供支持。
掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容
|
8月前
|
C#
45【软件技术基础】C#调用NPOI插件对EXCEL进行处理
NPOI插件进行EXCEL表格处理,不依赖第三方软件,功能强大,使用简便。 C#调用NPOI插件进行EXCEL单个表和文件夹中批量表的处理。
141 1
|
8月前
|
C# 开发者
C# 开发者技术:进程间数据共享之管道(Pipes)-异步通信版
主要类 1.NamedPipeClientStream 2.NamedPipeServerStream 解释:命名管道是一种进程间通信的方式,它允许不同进程之间在同一台机器上进行通信
451 2
C# 开发者技术:进程间数据共享之管道(Pipes)-异步通信版
C#面向对象程序设计课程实验五:实验名称:C#面向对象技术
C#面向对象程序设计课程实验五:实验名称:C#面向对象技术
C#面向对象程序设计课程实验五:实验名称:C#面向对象技术
|
设计模式 缓存 NoSQL
U3D客户端框架之类对象池技术优化C#语言GC
类对象池,类似对象池,顾名思义就是一定数量的已经创建好的类对象(Object)的集合。当需要创建对象时,先在池子中获取,如果池子中没有符合条件的对象,再进行创建新对象,同样,当对象需要销毁时,不做真正的销毁,而是将其对象SetActive(false),并存入池子中。这样就避免了大量对象的创建销毁,减少了GC,优化了性能。
C#实战:基于ItextSharp技术标签生成小工具
今天给大家分享小编基于ItextSharp制作的一款标签生成小工具,可供大家学习或者二次开发满足实际的需求使用。 使用技术:C\#+ItextSharp+Winfrom+Net4.0
C#实战:基于ItextSharp技术标签生成小工具
|
Web App开发 XML C#
C#远程调用技术WebService修炼手册
一、课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上。所以在本次分享课开课之前,我们要“约法三章”不谈论以下几个比较“严肃”和“敏感”的话题:WebServi...
1770 0
|
消息中间件 C#
C#多线程技术提高RabbitMQ消费吞吐率(二)
一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第二部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程!本次高级系列课程适合人群如下: 1、有一定的NET开发基础并对RabbitMQ技术有一定了解和认识。
1661 0