zoukankan      html  css  js  c++  java
  • .net reflection的一点研究

    反射相关的命名空间(我们就是通过这几个命名空间访问反射信息):

    System.Reflection.MemberInfo

    System.Reflection.EventInfo

    System.Reflection.FieldInfo

    System.Reflection.MethodBase

    System.Reflection.ConstructorInfo

    System.Reflection.MethodInfo

    System.Reflection.PropertyInfo

    System.Type

    System.Reflection.Assembly

    反射的作用:

    1、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型

    2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。

    3、反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

    应用要点:

    1、现实应用程序中很少有应用程序需要使用反射类型

    2、使用反射动态绑定需要牺牲性能

    3、有些元数据信息是不能通过反射获取的

    4、某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。

    应用场景:

    反射appdomain程序集

    反射单个程序集

    利用反射获取类型信息

    获取成员信息

    利用反射创建实例

    可以通过下面的几个方法实现:

    1、System.Activator 的CreateInstance方法。该方法返回新对象的引用。具体使用方法参见msnd

    2、System.Activator 的createInstanceFrom 与上一个方法类似,不过需要指定类型及其程序集

    3、System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFromAndUnwrap

    4、System.type的InvokeMember实例方法:这个方法返回一个与传入参数相符的构造函数,并构造该类型。

    5、System.reflection.constructinfo 的Invoke实例方法

    反射类型接口

               GetInterfaces/GetInterface/FindInterfaces

    动态创建委托

    System.Delegate提供了一些静态方法来动态创建一个委托,比如一个委托

    //获取类型,实际上这里也可以直接用typeof来获取类型

    Type   t   =   Type.GetType(TestSpace.TestClass);

    //创建代理,传入类型、创建代理的对象以及方法名称

    TestDelegate   method   =   (TestDelegate)Delegate.CreateDelegate(t,obj,GetValue);

     

    .net反射实现的背后少不了IL元数据

    所谓元数据:元数据用于描述公共语言运行库 (CLR) 在 JIT 编译 Microsoft 中间语言 (MSIL)、加载类、执行代码以及与 COM 传统型或本机领域进行交互时使用的运行库类型(类、接口和值类型)、字段、方法以及内部实现和布局信息。元数据包括在每个 CLR 组件中,并可供运行库、工具和服务使用。

    .net编译之后,类型信息将以元数据的形式保存在PE格式文件中,反射就是通过元数据实现

    http://msdn.microsoft.com/zh-cn/library/ms404430(v=VS.85).aspx

    可以查看《你必须知道的.net

    利用ilasm.exe可以查看相应的程序集元数据

    新版本的.net framework提供如下命名空间

    The classes of the System.Reflection.Emit namespace provide a specialized form of reflection that enables you to build types at run time.

    http://msdn.microsoft.com/en-us/library/f7ykdhsy(v=VS.71).aspx

  • 相关阅读:
    面向对象简述
    python面向对象
    Python中int()函数的用法浅析
    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
    python中关于round函数的小坑
    Xmind8破解,以及相关的流程和破解包
    生成器和生成器表达式
    brush图标
    js声明全局变量的方式
    js修改全局变量
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2251076.html
Copyright © 2011-2022 走看看