zoukankan      html  css  js  c++  java
  • 反射的基本用法

    反射的基本用法

    反射提供了一种动态的方法,使程序能够灵活的扩展、配置,在各种框架中广泛运用

    反射的核心优点是将原本写死在代码中方法功能抽取出来,使具体的执行仅由传递的字符串参数决定,以此做到无需修改程序本身,只通过传递字符串就能有不同的执行动作,至于字符串则可以通过各种形式提供,常见的行为有通过配置文件绑定不同的数据库提供程序、Web程序中通过URL选择执行不同的Controller/Action、数据库字段与类的映射等

    示例程序代码:https://gitee.com/wujunchengman/doc-example/tree/master/ReflectionExample

    因为涉及多个项目,还有引用关系,不适合直接贴代码,大家可以在码云上查看代码

    反射的基本使用步骤

    使用反射的基本步骤如下

    加载程序集
    // 加载路径下程序集
    Assembly assembly = Assembly.LoadFile(file)
    
    获取类型
    // 获取程序集中定义的公共类型
    Type[] types = assembly.GetExportedTypes();
    // 返回可以转换为IChange的类型
    Type type = types.FirstOrDefault(m => typeof(IChange).IsAssignableFrom(m));
    
    实例化对象
     // 实例化指定类型的对象
    IChange changeValue = (IChange) Activator.CreateInstance(type);
    
    使用对象
    listChange[select].Change(test);
    

    这里只是截取了关键的部分,所以不是很好看,还请大家到源代码中找对应位置

    有关这个例子的讲解

    目标需求:对字符串进行处理,并支持后续对功能进行扩展

    从当前程序的plugs目录下读取dll,并将所有继承IChange接口的类添加到操作列表中,IChange接口定义了描述操作名的Name属性,用于执行操作的Change方法

    然后用户根据操作列表的索引调用不同功能的Change方法

    通过反射,程序中并没有定义具体使用哪一个Change,而是从plugs目录下动态读取,如果需要扩展,只需要编写一个继承IChange接口的类,将其编译为dll放入pulgs目录下即可(Assembly->Type:程序集->类)

    Assembly的基本单位是程序集,不严谨的说是一个项目

    Type的基本单位是类

    在这个例子中,我写了ChangeToLower方法,大家可以自行扩展试一试

    需要注意的是,在使用反射时,拷贝dll时需要将其依赖项一同拷贝,否则运行时会报错

    如:在这个例子中,ChangeToLower依赖了IChange项目,所以运行时需要IChange.dll,正常情况下需要将ChangeToLower.dll和IChange.dll一同拷贝到plugs目录下。但是本例中存在特殊情况,即主程序也依赖于IChange,在编译时会自动将IChange.dll放至根目录下,所以不再需要拷贝IChange.dll至plugs

    新手学习,写得不好,如果哪里有疑问可以给我留言或者发邮件wujunchengman@163.com

    下一篇,有关反射的常用API

  • 相关阅读:
    14 Longest Common Prefix
    11. Container With Most Water
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    tableViewCell中添加webView,cell自适应webView高度,解决死循环的简单办法
    ASIHTTPRequest实现断点下载
    如何在iOS中使用Block
  • 原文地址:https://www.cnblogs.com/wujuncheng/p/13717281.html
Copyright © 2011-2022 走看看