天天看点

.Net—反射

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

1、什么是程序集?

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

2、使用程序集的好处?

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

3、什么是反射?

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

4、如何添加程序集的引用?

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

5、代码演示

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

public class Person
    {
        public Person(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
        private string tel;
        public Person()
        {
        }
        public string name{ get; set; }
        public int age { get; set; }
        public void SayHello() {
            Console.WriteLine("我是Preson类里面的SayHello方法");
        }
        private void SayEnglish()
        {
            Console.WriteLine("我是Preson类里面的SayEnglish方法");
        }
    }           

复制

class Student
    {

    }           

复制

在Common右击选择生成,此时在Common下的bin/debug目录下生成了一个名为:Common.dll的程序集文件。将此文件复制到控制台应用程序下的bin/debug目录

复制

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

复制

//获得指定的数据类型
            Type t = ass.GetType("Common.Person");           

复制

//获取Type中的所有方法
            MethodInfo[] mis = o.GetType().GetMethods();
            foreach (MethodInfo mi in mis)
            {
                Console.WriteLine(mi.Name);
            }           

复制

// 获取属性
             PropertyInfo[] pros = o.GetType().GetProperties();
             foreach (PropertyInfo type in pros)
             {
                 Console.WriteLine(type.Name);
             }           

复制

//调用了Person类中默认的无参数的构造函数
            object o = ass.CreateInstance("Common.Person");

            // object o = Activator.CreateInstance(t, "zhangsan", 5);
            Console.WriteLine(o.GetType()); //获取当前类的实例           

复制

MethodInfo mdi = o.GetType().GetMethod("SayHello");
            mdi.Invoke(o,null);           

复制

持续更新....