• 反射


    反射:简单的理解就是动态调用程序集,通过类型元数据创建对象,调用对象的成员等.
    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();
  • 相关阅读:
    HDU1852 Beijing 2008(快速幂+特殊公式)
    HihoCoder 1570 : 小Hi与法阵(简单几何)
    【转】反素数
    【整理】线段树30题
    SPOJcot2 Count on a tree II (树上莫队)
    【总结】曼哈顿距离转切比雪夫距离
    【初识】树上分块
    基于Tablestore Tunnel的数据复制实战
    【New Feature】阿里云快照服务技术解析
    基于日志服务的GrowthHacking(1):数据埋点和采集(APP、Web、邮件、短信、二维码埋点技术)
  • 原文地址:https://www.cnblogs.com/genesis/p/4889602.html
Copyright © 2020-2023  润新知