C#《Inside C#》笔记(十四) 反射

经过反射能够在运营时动态地得到1个利用的元数据。

 


反射相关的类和格局

与反射相关的类处在System.Reflection命名空间下,包罗Assembly、Module、MethodInfo、FieldInfo、PropertyInfo、伊夫ntInfo。

a)Type类

System.Type类是反射机制的焦点。Type类本人是三个抽象类,代表CTS通用项目系统中的有些项目。

对于曾经实例化的指标,可以选用<对象名称>.GetType()来获取Type类。其余也足以运用静态方法Type.GetType(“<type
name>”)取得未实例化对象的type类。使用第2种艺术时,<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或程序集。

切实的措施为

 

C# 1

 

 

在加载程序集文件并利用GetType()取得富有的类型后,通过采取Type.Is***两种措施做判定,找到所需的type,然后利用Activator.CreateInstance()激活该品种,随后就能够取得MethodInfo并调用Invoke来执行了。

四在运作时成立并实施代码

借助System.Reflection.Emit命名空间的始末,能够在内部存款和储蓄器动态地定义程序集、模块、类型,并将扭转的代码插入程序中履行。

例如,有生成HelloWorld方法的代码:

 

C# 2

C# 3

 

 

看起来步骤挺多的,但依据程序集-模块-类型-方法-方法体这样的创制顺序。然后就能够根据此前的晚绑定方法来使用了。

 

学学材质:Inside C# by Tom
Archer

 

相关文章