zoukankan      html  css  js  c++  java
  • 反射

    反射:简单的理解就是动态调用程序集,通过类型元数据创建对象,调用对象的成员等.
    1.反射无处不在,我们天天在使用,vs的智能提示,就是通过反射获取到类的属性、方法等,还有反编译工具也是通过反射实现。
    2.反射:就是动态获取程序集中的元数据来操作类型的。
    3.Type类实现反射的一个重要的类,通过它我们可以获取类中的所有信息,包括方法、属性等,可以动态调用类的属性、方法,Type是对类的描述,如何获取Person类中的所有属性?
    4.反射就是直接通过.dll来创建对象,调用成员.
    5.通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法,这个就叫做"反射".

    通过P/Invoke调用其它语言写的dll文件

    实例一:

    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            Type type1 = p.GetType();
            //获取当前实例
            Type type2 = typeof(Person);
            //获取当前类型的父类,可以获取父类的父类
            Console.WriteLine(type2.BaseType.ToString());
            //Console.WriteLine(type2.BaseType.BaseType.ToString());
            //获取当前类型中所有字段信息,这里只能获取私有字段
            FieldInfo[] fields = type2.GetFields();
            foreach (var item in fields)
            {
                Console.WriteLine(item.Name);
            }
            //获取当前类型中所有属性名称
            PropertyInfo[] profInfo = type2.GetProperties();
            foreach (var item in profInfo)
            {
                Console.WriteLine(item.Name);
            }
            Console.ReadKey();
        }
    }
    
    class Person
    {
        public string field1;
        public string field2;
        public string Name { get; set; }
        public int Age { get; set; }
        public void SayHi()
        {
            Console.WriteLine("Hi");
        }
    }

     实例二:获取程序集里面的类、方法

    //根据程序的路径,动态加载程序集
    Assembly asm = Assembly.LoadFile(@"C:用户目录我的文档visual studio 2012ProjectsReflactReflactinDebugReflact.dll");
    //获取该程序集的所有类型
    Type[] type = asm.GetTypes();
    foreach (var item in type)
    {
        Console.WriteLine(item.FullName);
    }
    //获取该程序集的所有public类型
    Type[] type2 = asm.GetExportedTypes();
    foreach (var item in type2)
    {
        Console.WriteLine(item.FullName);
    }
    //获取指定的类型
    Type type = asm.GetType("Reflact.TestReflact");
    //获取某个类型中的成员,调用
    MethodInfo method = type.GetMethod("SayHi");
    //创建一个TestReflact类型的对象
    //根据指定的Type,创建一个该类型的对象
    object obj = Activator.CreateInstance(type);
    //调用该方法
    method.Invoke(obj, null);
    //调用相同方法名没有参数的方法
    MethodInfo method2 = type.GetMethod("SayHello", new Type[] { });
    method2.Invoke(obj, null);
    //调用相同方法名有参数的方法
    MethodInfo method3 = type.GetMethod("SayHello", new Type[] { typeof(string) });
    method3.Invoke(Activator.CreateInstance(type), new object[] { "张三" });
    //如果方法有返回值的话,直接接收Invoke()方法的返回值就可以了
    //string result = (string)method3.Invoke(Activator.CreateInstance(type), new object[] { "张三" });
    Console.ReadKey();
  • 相关阅读:
    leetcode常规算法题复盘(第九期)——拼接最大数
    leetcode常规算法题复盘(第八期)——重构字符串
    leetcode常规算法题复盘(基础篇)——十大排序算法(二)
    leetcode常规算法题复盘(基础篇)——十大排序算法(一)
    leetcode常规算法题复盘(第七期)——区间和的个数(附带排序算法归纳)
    leetcode常规算法题复盘(第六期)——最小体力消耗路径
    leetcode常规算法题复盘(第五期)——八皇后
    leetcode常规算法题复盘(第四期)——接雨水
    leetcode常规算法题复盘(第三期)——Pow(x,n)(快速幂)
    leetcode常规算法题复盘(第二期)——特殊的二进制序列
  • 原文地址:https://www.cnblogs.com/genesis/p/4889602.html
Copyright © 2011-2022 走看看