System.Reflection简介
发布日期:2021-06-30 19:38:37 浏览次数:2 分类:技术文章

本文共 3825 字,大约阅读时间需要 12 分钟。

转载注明出处:

.net的元数据可以完整地描述类型,那么通过System.Reflection,可以在运行时发现类型格式,我们来看一下元数据:

class Class2        {                        private int x;            private int y;            public Class2(int a, int b)            {                x = a;                y = b;            }            public int Add()            {                return x+y;            }        }
元数据,请看代码注释
TypeDef #2 (02000003)// -------------------------------------------------------//     TypDefName: Class2  (02000003)//     Flags     : [NestedPrivate] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit]  (00100003)//     Extends   : 01000002 [TypeRef] System.Object//     EnclosingClass : Test.Class1 (02000002)//     Field #1 (04000004)//     -------------------------------------------------------//         Field Name: x (04000004)   ///字段名 //         Flags     : [Private]  (00000001)  //访问修饰//         CallCnvntn: [FIELD]//         Field type:  I4  //字段类型// //     Field #2 (04000005)//     -------------------------------------------------------//         Field Name: y (04000005)//         Flags     : [Private]  (00000001)//         CallCnvntn: [FIELD]//         Field type:  I4// //     Method #1 (06000004) //     -------------------------------------------------------//         MethodName: .ctor (06000004)   ///构造函数//         Flags     : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor]  (00001886)  //访问修饰//         RVA       : 0x00002083//         ImplFlags : [IL] [Managed]  (00000000)  //CLR 托管代码//         CallCnvntn: [DEFAULT]//         hasThis //         ReturnType: Void   //返回类型//         2 Arguments    //             Argument #1:  I4   //             Argument #2:  I4//         2 Parameters   //参数列表//             (1) ParamToken : (08000003) Name : a flags: [none] (00000000)  //参数类型//             (2) ParamToken : (08000004) Name : b flags: [none] (00000000)// //     Method #2 (06000005) //     -------------------------------------------------------//         MethodName: Add (06000005) 方法名//         Flags     : [Public] [HideBySig] [ReuseSlot]  (00000086)  //访问修饰//         RVA       : 0x00002099//         ImplFlags : [IL] [Managed]  (00000000)//         CallCnvntn: [DEFAULT]//         hasThis //         ReturnType: I4  //返回类型//         No arguments.//
我们看到在元数据种非常详细的定义了一个类中的任何成员,还包括了程序集所引用的其他程序集的信息
AssemblyRef #1 (23000001)// -------------------------------------------------------//     Token: 0x23000001//     Public Key or Token: b7 7a 5c 56 19 34 e0 89 //     Name: mscorlib//     Version: 2.0.0.0//     Major Version: 0x00000002//     Minor Version: 0x00000000//     Build Number: 0x00000000//     Revision Number: 0x00000000//     Locale: 
// HashValue Blob:// Flags: [none] (00000000)// //

OK,了解了元数据,我们现在来看看上面图中,那些类的基本功能,.NetFrameWork库类的层次程序集包含模块,模块包含类型,类型又包含成员(方法,属性,字段,事件等)。

 

1.Assembly:主要是加载和操纵一个程序集.

2.ParameterInfo:该类保存给定参数的信息,也就是说方法的参数,可以用该类来操作.

3.Module:访问带有多模块程序集的给定模块,在VS环境下只可以编译出单Module的程序集.

4.MemberInfo:该类是抽象基类,为他的子类定义了公共的行为.如MemberTypes,MemberName等.而他的子类则分别是方法,属性,字段,事件等信息的具体实现.

 

那么这些类如何来完成类型的反射呢?

在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于“自成一体”的单元中,这个单元称为装配件。我们可以在程序运行期间访问这些信息。
 
在System.Reflection中有这样一个class————Assembly,我们可以通过它来加载一个装配件。方法如下: 
Assembly assm=Assembly.LoadFrom(fileName); 
其中filename是要加载的装配件的文件名称(带路径)。 
接下来,我们就可以通过使用System.Reflection内提供的Info classes来获取装配件中的信息了。

Assembly asm = Assembly.Load("Test");//dll的名称Type t = asm.GetType("Test.Class2");//类的完全命名object obj = Activator.CreateInstance(t); //创建Class2的实例MethodInfo mi = t.GetMethod("Add");//获取Class2中Add方法的信息.string s = (string)mi.Invoke(obj,null);//执行方法,需要参数1:Class2的实例,2:方法的参数列表.           FieldInfo pi = t.GetField("x"); //获取字段信息pi.GetValue(obj); //得到字段值

事件和属性的反射调用,同上述代码差不多,不再赘述.上面的代码中我们使用了Type这个类型,这里做一下简单的介绍

System.Type定义了大量的成员,可以用来检查一个类型的元数据,如GetMethod,GetFields等方法,基本上一个类型的所有信息都可以得到,很好很强大.呵呵.

转载地址:https://linxinfa.blog.csdn.net/article/details/51803069 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Mono.Cecil简介与示例
下一篇:Unity3d资源处理器AssetPostprocessor简单用法

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年05月03日 15时53分25秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

tensorflow使用tensorboard进行可视化 2019-04-30
神经网络调参实战(二)—— activation & initializer & optimizer 2019-04-30
凸优化 convex optimization 2019-04-30
数据库索引 & 为什么要对数据库建立索引 / 数据库建立索引为什么会加快查询速度 2019-04-30
IEEE与APA引用格式 2019-04-30
research gap 2019-04-30
pytorch训练cifar10数据集查看各个种类图片的准确率 2019-04-30
Python鼠标点击图片,获取点击点的像素坐标 2019-04-30
路径规划(一) —— 环境描述(Grid Map & Feature Map) & 全局路径规划(最优路径规划(Dijkstra&A*star) & 概率路径规划(PRM&RRT)) 2019-04-30
神经网络调参实战(四)—— 加深网络层次 & 批归一化 batch normalization 2019-04-30
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(1)—— 假设检验(μ&卡方检验&方差检验(F检验))&相关系数(皮尔逊&斯皮尔曼) 2019-04-30
RRT算法(快速拓展随机树)的Python实现 2019-04-30
路径规划(二) —— 轨迹优化(样条法) & 局部规划(人工势能场法) & 智能路径规划(生物启发(蚁群&RVO) & 强化学习) 2019-04-30
D*算法 2019-04-30
强化学习(四) —— Actor-Critic演员评论家 & code 2019-04-30
RESTful API 2019-04-30
优化算法(四)——粒子群优化算法(PSO) 2019-04-30
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(2)——回归分析(最小二乘法&决定系数&残差不相关)&主成分分析&奇异值分解 2019-04-30
数据在Oracle中的存储 2019-04-30
优化算法(五)—人工蜂群算法Artificial Bee Colony Algorithm(ABC) 2019-04-30