• .Net—反射


    在学习反射之前,先来理解以下几个概念。

    什么是程序集?

    程序集是.net中的概念。
    .Net中的dll文件与exe文件都是程序集。(exe与dll的区别?)
    exe文件是可执行文件,有执行入口。可直接运行。而dll不可以直接运行,可供其它程序调用。
    程序集(Assembly)可以看做是一堆相关类打一个包,相当于Java中的Jar包。
    程序集包含资源文件、类型元数据(描述在代码中定义的每一类型和成员,二进制形式)、IL代码(这些都被装在exe或dll中),每个程序集都有自己的名称、版本等信息。这些信息可以通过Assembly.cs文件来自定义。

    使用程序集的好处?

    程序中只引用必须的程序集,减小程序的尺寸。
    程序集可以封装一些代码,只提供必要的访问接口。
    方便功能拓展,不需要修改源代码。

    什么是反射?

    反射就是动态获得程序集里面的元数据。(比如获取某一个类里面的属性和方法,后面会有代码演示)

    如何添加程序集的引用?

    添加路径、项目引用
    不能循环添加引用

    代码演示

    新建一个空白解决方案,添加一个控制台应用程序和一个名为Common的类库。在Common里面添加一个Person类和Student类,代码如下

     1 public class Person
     2 {
     3 public Person(string name, int age)
     4 {
     5 this.name = name;
     6 this.age = age;
     7 }
     8 
     9 private string tel;
    10 
    11 public Person()
    12 {
    13 }
    14 public string name{ get; set; }
    15 public int age { get; set; }
    16 public void SayHello() {
    17 
    18 Console.WriteLine("我是Preson类里面的SayHello方法");
    19 }
    20 
    21 private void SayEnglish()
    22 {
    23 Console.WriteLine("我是Preson类里面的SayEnglish方法");
    24 }
    25 }
    26 
    27 class Student
    28 {
    29 
    30 }
    31 在Common右击选择生成,此时在Common下的bin/debug目录下生成了一个名为:Common.dll的程序集文件。将此文件复制到控制台应用程序下的bin/debug目录
    32 
    33 //获取路径
    34 string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Common.dll");
    35 //加载程序集文件
    36 Assembly ass = Assembly.LoadFile(path);
    37 Console.WriteLine("加载程序集成功..");
    38 
    39 //获得程序集中所有公开的数据
    40 Type[] types = ass.GetExportedTypes();
    41 
    42 //获得程序集中所有公开的数据和不公开的数据
    43 //Type[] types = ass.GetTypes();
    44 foreach (Type type in types)
    45 {
    46 Console.WriteLine(type.FullName); 
    47 Console.WriteLine(type.Name);
    48 Console.WriteLine(type.Namespace);
    49 }
    50 
    51 Console.ReadKey();

    执行结果

    加载程序集成功..
    Common.Person
    Person
    Common
    若使用 Type[] types = ass.GetTypes();结果为:
    加载程序集成功..
    Common.Person
    Person
    Common
    Common.Student
    Student
    Common

     1 //获得指定的数据类型
     2 Type t = ass.GetType("Common.Person");
     3 //获取Type中的所有方法
     4 MethodInfo[] mis = o.GetType().GetMethods();
     5 foreach (MethodInfo mi in mis)
     6 {
     7 Console.WriteLine(mi.Name);
     8 }
     9 // 获取属性
    10 PropertyInfo[] pros = o.GetType().GetProperties();
    11 foreach (PropertyInfo type in pros)
    12 {
    13 Console.WriteLine(type.Name);
    14 }
    15 //调用了Person类中默认的无参数的构造函数
    16 object o = ass.CreateInstance("Common.Person");
    17 
    18 // object o = Activator.CreateInstance(t, "zhangsan", 5);
    19 Console.WriteLine(o.GetType()); //获取当前类的实例
    20 MethodInfo mdi = o.GetType().GetMethod("SayHello");
    21 mdi.Invoke(o,null);

    持续更新....

    欢迎评论留言交流
  • 相关阅读:
    Java类练习一则
    windows下安装Apache+PHP
    Java 数组/对象练习一则
    windows 安装 apache 报错解决
    延时任务机制
    Javashop电商系统-会员登录方式
    基于canvas商品海报生成源码分享
    uniapp引入微信小程序直播组件
    电商系统中库存的存储于扣减
    电商系统nuxt的中间件代码分享
  • 原文地址:https://www.cnblogs.com/netlws/p/8948496.html
Copyright © 2020-2023  润新知