C#的反射

`#region 知识点五 语法相关

        #region Type类
        //类的信息类
        //它是反射功能的基础
        //它是访问元数据的主要方式
        //使用 Type 的成员获取 有关类型声明的信息
        //有关类型的成员(如构造函数、方法、字段、属性和类的事件)
        #region Type-- 1、获取Type
        //1.万物之父Object 中的GetType() 可以获取对象的Type
        int a = 42;
        Type type = a.GetType();
        Console.WriteLine(type);
        //2.通过typeof关键字 传入类名 也可以得到对象的Type
        Type type2 = typeof(int);
        Console.WriteLine(type2);
        //3.通过类的名字 也可以获取类型
        //注意,类名必须包含命名空间,不然找不到
        Type type3 = Type.GetType("System.Int32");
        Console.WriteLine(type3);
        #endregion

        #region Type-- 2、得到类的程序集信息
        //可以通过Type得到类所在的程序集信息
        Console.WriteLine(type.Assembly);
        Console.WriteLine(type2.Assembly);
        Console.WriteLine(type3.Assembly);
        #endregion

        #region Type-- 3、获取类中所有的公共成员
        //首先得到Type
        Type t = typeof(Test);
        //然后得到所有公共成员(命名空间 using System.Reflection )
        MemberInfo[] infos = t.GetMembers();
        for (int i = 0; i < infos.Length; i++)
        {
            Console.WriteLine(infos[i]);
        }

        #endregion

        #region Type-- 4、获取类的公共构造函数并调用
        //1.获取所有构造函数
        ConstructorInfo[] ctors = t.GetConstructors();
        for (int i = 0; i < ctors.Length; i++)
        {
            Console.WriteLine(ctors[i]);
        }
        //2.获取其中一个构造函数 并执行
        //得构造函数传入 Type数组 数组中内容按照顺序是参数类型
        //执行构造函数传入 object数组 表示按顺序传入的具体参数

        //2--1得到无参构造
        ConstructorInfo info = t.GetConstructor(new Type[0]);
        //执行无参构造 ,无参构造如果没有参数,传null 即可
        Test  obj = info.Invoke(null) as Test;
        Console.WriteLine(obj.j);

        //2--2得到有参构造:一个参数的有参构造
        ConstructorInfo info2 = t.GetConstructor(   new Type[] { typeof(int)}   );
        //执行有参构造
        obj = info2.Invoke(new object[] { 123 }) as Test;
        Console.WriteLine(obj.str);
        
        //两个参数的有参构造
        ConstructorInfo info3 = t.GetConstructor(new Type[] { typeof(int), typeof(string) });
        obj = info3.Invoke(new object[] { 911, "拜拜阿白白" }) as Test;
        Console.WriteLine(obj.str);
        #endregion

        #region Type-- 5、获取类的公共成员变量
        //1.得到所有成员变量
        FieldInfo[] fieldInfos = t.GetFields();
        for (int i = 0; i < fieldInfos.Length; i++)
        {
            Console.WriteLine(fieldInfos[i]);
        }
        //2.得到指定名称的公共成员变量
        FieldInfo InfoJ = t.GetField("j");
        Console.WriteLine(InfoJ);
        //3.通过反射获取和设置对象的值
        Test test = new Test();
        test.j = 6677;
        test.str = "哈哈哈哈哈哈哈";
        //  3-1通过反射 获取对象的某个变量的值
        Console.WriteLine(InfoJ.GetValue(test));
        //  3-2通过反射 设置指定对象的某个变量的值
        InfoJ.SetValue(test,1122334455);
        Console.WriteLine(InfoJ.GetValue(test));
        Console.WriteLine(test.j);
        #endregion

        #region Type-- 6、获得类的公共成员方法
        //通过Type类的GetMethod方法 得到类中的 方法
        //MethodInfo 是方法的反射信息
        Type strType = typeof(string);
        //1.如果存在方法重载,用Type数组表示参数类型
        MethodInfo[] methods = strType.GetMethods();
        for (int i = 0; i < methods.Length; i++)
        {
            Console.WriteLine(methods[i]);
        }
        MethodInfo subStr = strType.GetMethod("Substring",
            new Type[] { typeof(int), typeof(int) });
        //2.调用该方法
        //注意:如果是静态方法 Invoke中第一个参数传null 即可
        string str = "abcdefghijk";
        //第一个参数 相当于 是哪个对象要执行这个成员方法
        object result = subStr.Invoke(str,new object[] {2,5});
        Console.WriteLine( result);

        MethodInfo subStr2 = strType.GetMethod("Substring",
            new Type[] { typeof(int), typeof(int) });

        #endregion

        #region Type-- 7、得枚举、事件、接口、属性
        //Type 
        //得枚举
        //GetEnumName;
        //GetEnumNames;

        //得事件
        //GetEvent
        //GetEvents

        //得接口
        //GetInterface
        //GetInterfaces

        //得属性
        //GetProperty
        //GetPropertys
        #endregion



        #endregion  Type结尾

        #region Assembly类
        //程序集类
        //主要用来加载其他程序集,加载后
        //才能用Type来使用其他程序集中的信息
        //如果想要使用不是自己程序集中的内容 需要先加载程序集
        //比如Dll 文件(库文件)
        //简单的把库文件看成一种代码仓库,它能提供给使用者一些可以直接拿来用的变量、函数或类

        //三种加载程序集的函数 
        //一般用来加载在同一文件夹下的其他程序集
        Assembly assembly = Assembly.Load("程序集名称");

        //一般用来加载不在同一文件夹下的其他程序集
        Assembly assembly2 = Assembly.LoadFrom("包含程序集清单的文件的名称或路径");
        Assembly assembly3 = Assembly.LoadFile("要加载的文件的完全限定路径");

        //1.先加载一个指定的程序集
        Assembly asembly= Assembly.LoadFile("@...");
        Type[] types = asembly.GetTypes();
        for (int i = 0; i < types.Length; i++)
        {
            Console.WriteLine(types[i]);
        }
        //2.在加载程序集中的一个类对象 之后才能使用反射 
        Type icon = asembly.GetType("Lesson18_练习题.Icon");  //命名空间.类名
        MemberInfo[] members = icon.GetMembers();
        for (int i = 0; i < members.Length; i++)
        {
            Console.WriteLine(members[i]);
        }
        //通过反射 实例化一个对象
        //首先得到枚举Type 来得到可以传入的参数
        Type moveDir = asembly.GetType("Lesson18_练习题.E_MoveDir");
        FieldInfo right = moveDir.GetField("Right");//得到枚举值 因为枚举值也相当于枚举类型的字段

        //直接实例化对象
        object iconObj = Activator.CreateInstance(icon, 10, 5, right.GetValue(null));
        //得到对象中的方法   通过反射
        MethodInfo move = icon.GetMethod("Move");
        MethodInfo draw = icon.GetMethod("Draw");
        MethodInfo clear = icon.GetMethod("Clear");

        Console.Clear();
        while (true)
        {
            Thread.Sleep(1000);
            clear.Invoke(iconObj,null);
            move.Invoke(iconObj,null);
            draw.Invoke(iconObj,null);
        }

        #endregion Assembly结尾

        #region Activator类
        //用于快速实例化一个类
        //用于将 Type对象 快捷实例化对象
        //先得到Type 

        //然后 快速实例化一个对象
        Type testType = typeof(Test);
        //1.无参构造
        Test testObj = Activator.CreateInstance(testType) as Test;
        Console.WriteLine(testObj.str);
        //2.有参构造
        testObj = Activator.CreateInstance(testType, 199) as Test;
        Console.WriteLine(testObj);

        testObj = Activator.CreateInstance(testType, 10086,"我勒个去") as Test;
        Console.WriteLine(testObj);

        #endregion Activator 结尾

        #endregion

`

posted @ 2021-11-23 08:49  赛涛科技  阅读(51)  评论(0)    收藏  举报