• 反射基础


    关键词

    Assembly 使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
    Module 通过它可以获取包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 
    MemberInfo 这是一个基类,它定义了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多个公用行为。
    Type 是System命名空间下的一个类,一般用于装载反射得到的类对象,通过Type可以得到一个类的内部信息,也可以通过它反射创建一个对象。
    EventInfo 通过它可以获取事件的相关信息。如事件的名称、事件处理程序数据类型、声明类型等,还可以添加或移除事件处理程序。
    FieldInfo 可以通过它获取字段的相关信息。如字段的名称、访问修饰符等,还可以获取或设置字段值。 
    MethodInfo 通过它可以获取方法的相关信息。例如方法的名称、返回类型、参数、访问修饰符等。使用Type的GetMethods或GetMethod方法来调用特定的方法。
    PropertyInfo 通过它可以获取属性的相关信息。例如属性的名称、数据类型、声明类型和只读或可写状态等,还可以获取或设置属性值。
    ConstructorInfo 通过它可以了解构造函数的属性及调用构造函数。可以由Type对象的GetConstructors或GetConstructor方法返回的。
    ParameterInfo 通过它可以了解参数相关信息。例如参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

    什么是反射?

    Reflection,中文翻译为反射,是.Net中获取运行时类型信息的方式。
    .Net的应用程序由几个部分:程序集(Assembly)、模块(Module)、类型 (class)组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。

    如何使用反射获取程序集?

    通过Assembly类对象的Load方法、LoadFrom方法和LoadFile方法可以获取程序集的相关信息。

    三者之间的区别:
    LoadFrom和Load差不多,只是LoadFrom是多了先获取其中的程序集版本,语言文化,公钥标记等信息,把他们传递给 Load方法这一步。
    LoadFrom不能用于加载标识相同但路径不同的程序集。
    LoadFile 方法用来来加载和检查具有相同标识但位于不同路径中的程序集.但不会加载程序的依赖项。
    1、Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("abc.dll"),则载入abc.dll,假如abc.dll中引用了def.dll的话,def.dll并不会被载入。
    Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,def.dll也会被载入。
    2、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,比如abc.dll有两个版本(版本1在目录1下,版本2放在目录2下),程序一开始时载入了版本1,当使用Assembly.LoadFrom("2//abc.dll")载入版本2时,不能载入,而是返回版本1。 
    Assembly.LoadFile的话则不会做这样的检查,比如上面的例子换成Assembly.LoadFile的话,则能正确载入版本2。

    如何使用反射获取模块?

    1、用Object.GetType().Module来获取。
    2、用Assembly类对象的GetModules方法来获取。

    如何使用反射获取Type对象?

    1、用typeof运算符获取。
    2、用静态方法Type.GetType来获取。
    3、用Assembly类对象的GetType或者GetTypes方法来获取。

    如何根据类型来动态创建对象?

    1、用System.Reflection空间下的Assembly类对象的CreateInstance方法来创建对象。 
    2、用System.Activator类提供的静态方法CreateInstance来创建对象。

    如何获取方法以及动态调用特定的方法?

    通过Type类对象的GetMethod或者GetMethods方法获取到类里面的方法,然后用MethodInfo对象的Invoke方法去执行。

    如何获取字段以及动态设置获取它?

    通过Type类对象的GetField方法来获取字段,用FieldInfo对象存储获取到的字段,可以通过FieldInfo对象的GetValue和SetValue方法读取和设置字段。

    如何获取属性以及动态设置获取它?

    通过Type类对象的GetPropertie或者GetProperties方法来获取属性,用PropertyInfo对象存储获取到的属性,然后通过PropertyInfo对象的GetValue和SetValue方法读取和设置属性值。

    动手尝试

    1、创建个类库工程,在这工程里面定义一个类。(我这里工程名为:Study__Reflection,类名为:StudyReflection)

     View Code

    把这工程指定好路径编译好。生成的dll文件就是准备用于学习反射相关知识的。

    下面是反射的基本用法: 

     View Code
    有志者事竟成,破釜沉舟,百二秦关终属楚; 苦心人天不负,卧薪尝胆,三千越甲可吞吴。
  • 相关阅读:
    变分自编码器(Variational Autoencoder, VAE)通俗教程
    神经网络图灵机(Neural Turing Machines, NTM)
    【Java设计模式】单例模式
    SupportV7包中 SwipeRefreshLayout 修改下拉控件的距离
    eclipse项目导入androidstudio
    LiveWriter Test
    【Android学习】XML文本的三种解析方式(通过搭建本地的Web项目提供XML文件)
    【百度地图学习-一】初始化以及TextOverlay
    【Android学习】四种布局方式
    【Android学习】数据传递三种方式
  • 原文地址:https://www.cnblogs.com/zhangbin89021/p/3756211.html
Copyright © 2020-2023  润新知