• .NET框架图解之五:System.Reflection


    这篇文章我们来学习System.Reflection,.net中反射的核心类.先来看图:

    前面的文章,我们说过.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: <null>
    //     HashValue Blob:
    //     Flags: [none] (00000000)
    // 
    // 

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

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

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

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

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

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

     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等方法,基本上一个类型的所有信息都可以得到,很好很强大.呵呵.

  • 相关阅读:
    Domain Model & Code First
    业务逻辑-Domain Model
    业务逻辑层-Active Record
    业务逻辑层-Transaction Script
    Web项目结构分层
    Autofac集成webform和mvc项目
    Autofac依赖注入应用
    在Jetson TX2上安装OpenCV(3.4.0)
    目标检测之yolo源码分析
    USB设备驱动模型
  • 原文地址:https://www.cnblogs.com/hanmos/p/2215708.html
Copyright © 2020-2023  润新知