zoukankan      html  css  js  c++  java
  • 反射

    在学习反射之前,先了解一下什么是程序集

    net中的dll与exe文件都是程序集(区别,exe可执行,dll不可以)

    程序集包含资源文件,类型元数据(也就是说属性、字段、参数、函数等)、IL代码,每个称袭击都有自己的名称、版本等信息

    不添加引用时获取程序集的数据

    反射就是动态获取程序集的元数据

    命名空间

    System.Reflection

    dll文件

    namespace ReflectionTest
    {
        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public char Gender { get; set; }
    
            public virtual void Say()
            {
                Console.WriteLine("我是一个人");
            }
        }
        class Teacher:Person
        {
            public override void Say()
            {
                Console.WriteLine("我是一名老师");
            }
        }
        class Student : Person
        {
            public override void Say()
            {
                Console.WriteLine("我是一名学生");
            }
        }
    }

    方法

    GetExportedTypes()  获取程序集中定义的公共类型

    //AppDomain.CurrentDomain.BaseDirectory获取当前程序集目录,拼接上dll文件名
                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ReflectionTest.dll");
                //加载程序集
                Assembly ass = Assembly.LoadFile(path);
                //获取程序集中定义的公共类型
                Type[] types = ass.GetExportedTypes();
                foreach (Type item in types)
                {
                    Console.WriteLine(item.Name);
                    Console.WriteLine(item.FullName);
                    Console.WriteLine(item.Namespace);
                }

    GetTypes()  获取程序集定义的类型

     //获取程序集定义的类型,包括internal类型,Teacher和Student类都没显示写访问修饰符
                Type[] types = ass.GetTypes();
                foreach (Type item in types)
                {
                    Console.WriteLine(item.Name);
                    Console.WriteLine(item.FullName);
                    Console.WriteLine(item.Namespace);
                }

    GetType()    获取程序集指定名称的System.Type对象

    //获取程序集指定名称的System.Type对象
                Type t = ass.GetType("ReflectionTest.Student");
                Console.WriteLine(t.Name);

    动态创建对象实例

    CreateInstance() 

    //调用的是无参构造函数,所以当没有无参构造时,就会出错
                object obj = ass.CreateInstance("ReflectionTest.Student");
                Console.WriteLine(obj.GetType());

    Activator.CreateInstace()  传参数(解决上面CreateInstance的问题)

    Type t = ass.GetType("ReflectionTest.Student");
                object obj = Activator.CreateInstance(t,"张三",18,'');
                Console.WriteLine(obj.GetType());

    获取属性方法(包括父类的)

     //获取类属性
                PropertyInfo[] proInfo = obj.GetType().GetProperties();
                foreach (PropertyInfo item in proInfo)
                {
                    Console.WriteLine(item.Name);
                }
                //获取类方法
                MethodInfo[] mInfo = obj.GetType().GetMethods();
                foreach (MethodInfo item in mInfo)
                {
                    Console.WriteLine(item.Name);
                }

    方法调用

    obj.GetType().GetMethod("Say").Invoke(obj, null);

     常用方法

    bool IsAssignableFrom(Type c)  判断当前的类型变量是不是可以接收c类型变量的赋值

    bool IsInstanceOfType(object obj)  判断对象obj是否是当前类的实例(当前类可以是obj的类、父类、接口)

    bool IsSubclassOf(Type c)  判断当前类是否是类c的子类(不包含接口)

    bool IsAbstact  判断是否是抽象类

  • 相关阅读:
    [Unity热更新]04.卸载方式
    [Unity热更新]03.加载方式
    [Unity热更新]02.依赖关系
    [Unity热更新]01.打包与加载基础
    [Unity优化]批处理05:UGUI
    [Unity优化]gc02:StringBuilder
    [Unity优化]gc01:字符串常量池
    虚拟机中安装centos系统的详细过程
    零基础学习java------40---------Maven(maven的概念,安装,maven在eclipse中使用),springboot(spring整合springmvc(注解),spring整合mybatis(常见的配置文件)),前端页面(bootstrap软件)
    零基础学习java------39---------json格式交互,Restful(不懂),静态资源映射,SSM整合(ssm整合思想,application.xml文件详解(声明式事务管理),)
  • 原文地址:https://www.cnblogs.com/xiaonangua/p/7340734.html
Copyright © 2011-2022 走看看