网站首页 > 基础教程 正文
通过反射可以在运行时动态地获取一个应用的元数据。
一 反射相关的类和方法
与反射相关的类处在System.Reflection命名空间下,包括Assembly、Module、MethodInfo、FieldInfo、PropertyInfo、EventInfo。
a)Type类
System.Type类是反射机制的核心。Type类本身是一个抽象类,代表CTS通用类型系统中的某个类型。
对于已经实例化的对象,可以使用<对象名称>.GetType()来取得Type类。另外也可以使用静态方法Type.GetType(“<type name>”)取得未实例化对象的type类。使用第二种方法时,<type name>必须是CTS类型系统的类型名称,而不是C#别名,这可以确保.NET平台下的多语言通用性。
b)使用Type类
通过Type类,可以使用Type.IsByRef\IsClass\IsEnum\IsExplicitLayout\IsInterface\IsPublic\IsSealed等各种各样的方法来取得所需的信息。
二 通过反射使用程序集或模块
程序集是一个包含了若干PE(Portable Executable)文件的物理文件,.NET中对应的类为Assembly。通过Assembly类,可以进行如下操作:
遍历程序集内部的所有类型
取得程序集的所有模块
获取程序集的文件名、物理路径
查看程序集的版本及安全信息
取得程序集的入口
通过方法Assebmbly a= Assembly.LoadFrom(<程序集路径>)可以加载指定的程序集文件,然后Type[] types=a.GetTypes()可以取得程序集中的所有类型组成的数组。
三 使用反射实现晚绑定
有些应用场景下,在编译时无法确定所有事情(比如包含哪些DLL),例如一个软件的插件,这时需要使用晚绑定技巧,让软件在运行时动态的决定要加载的DLL或程序集。
具体的方式为
在加载程序集文件并使用GetType()取得所有的类型后,通过使用Type.Is***系列方法做判断,找到所需的type,然后使用Activator.CreateInstance()激活该类型,随后就可以取得MethodInfo并调用Invoke来执行了。
四在运行时创建并执行代码
借助System.Reflection.Emit命名空间的内容,可以在内存动态地定义程序集、模块、类型,并将生成的代码插入程序中执行。
例如,有生成HelloWorld方法的代码:
看起来步骤挺多的,但遵循程序集-模块-类型-方法-方法体这样的创建顺序。然后就可以按照先前的晚绑定方法来使用了。
学习资料:Inside C# by Tom Archer
猜你喜欢
- 2024-10-11 工艺包文件设计菜鸟笔记 1.3工艺说明
- 2024-10-11 工艺包文件设计菜鸟笔记 1.5质量平衡
- 2024-10-11 《谁说菜鸟不会数据分析》笔记及思考
- 2024-10-11 人为什么会浑浑噩噩?原来是没搞清楚这些事
- 2024-10-11 《菜鸟的python笔记》python初学者的福音,完整版开放下载
- 2024-10-11 木已成舟,核废水真的200多天才会影响到我们吗?
- 2024-10-11 「02」第一个VUE程序|菜鸟笔记 vue创始者
- 2024-10-11 ARM 基础知识 arm应用知识
- 2024-10-11 Python菜鸟笔记-控制语句 python 控制系统
- 2024-10-11 网络菜鸟笔记八 -管理Cisco互联网络
- 05-14CSS基础知识(一) CSS入门
- 05-14CSS是什么? CSS和HTML有什么关系?
- 05-14什么是CSS3?
- 05-14CSS如何画一个三角形?
- 05-14初识CSS——CSS三角制作
- 05-14Wordpress建站教程:给图片添加CSS样式
- 05-14HTML和HTML5,css和css3的区别有哪些?
- 05-14Html中Css样式Ⅱ
- 最近发表
- 标签列表
-
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- mysql教程 (60)
- pythonif (86)
- location.href (69)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)