反射

  class Test
    {
        private int i = 1;
        public int j = 0;
        public string str = "123";

        public Test()
        {

        }

        public Test(int i)
        {
            this.i = i;
        }

        public Test(int i,string str):this(i)
        {
            this.str = str;
        }

        public void Speak()
        {
            Console.WriteLine(i);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Type type1 = typeof(int);

            Type type2 = Type.GetType("System.Int32");

            //通过Type可以得到类型所在程序集信息
            Console.WriteLine(type1.Assembly );
            Console.WriteLine(type2.Assembly );
            Console.WriteLine("****************************");
            Console.WriteLine("****************************");


            //获取类中的所有公共成员
            //1首先得到Type
            Type t = typeof(Test);
            //然后得到所有公共成员
            MemberInfo[] infos = t.GetMembers();
            for (int i = 0; i < infos.Length ; i++)
            {
                Console.WriteLine(infos[i]);
            }

            Console.WriteLine("****************************");
            Console.WriteLine("****************************");
            //获取所有构造函数
            ConstructorInfo[] ctors = t.GetConstructors();
            for (int i = 0; i < ctors.Length; i++)
            {
                Console.WriteLine(ctors[i]);
            }

            Console.WriteLine("****************************");
            Console.WriteLine("****************************");
            //2获取其中一个构造函数 并执行
            //得到构造函数传入 Type数组 数组中内容按顺序是参数类型
            //执行构造函数传入 object数组 表示按顺序传入的参数
            // 2-1 得到无参构造
            Type[] ty = new Type[0] {};//没有参数


           
            ConstructorInfo info = t.GetConstructor(new Type[0]);
            Test obj= info.Invoke(null) as Test ;

            Console.WriteLine(obj.j );
            Console.WriteLine("****************************");
            Console.WriteLine("****************************");

            //2-2得到有参构造
            ConstructorInfo info1 = t.GetConstructor(new Type[] { typeof(int) });

            obj = (Test)info1.Invoke(new Object[] { 5});

            //通过反射获取对象的值
            FieldInfo fis = t.GetField("i",BindingFlags.NonPublic|BindingFlags.Instance  );
            Object in1=  fis.GetValue(obj);
            Console.WriteLine(in1);

            Console.WriteLine("****************************");
            Console.WriteLine("****************************");

            //通过反射设置对象的值
            fis.SetValue(obj, 100);
            Object in2 = fis.GetValue(obj);
            Console.WriteLine(in2);

            Console.WriteLine("****************************");
            Console.WriteLine("****************************");


            //获取类的公共成员方法
            //通过Type类中的GetMethod方法 得到类中参数类型
            //MethodInfo 是方法的反射信息


            //1、如果存在方法重载 用type数组表示参数类型
            Type strtype = typeof(string);

            MethodInfo[] method = strtype.GetMethods();  //获取多个方法
            for (int i = 0; i < method.Length; i++)
            {
                Console.WriteLine(method[i]);
            }


            //2 调用该方法
            //注意:如果是静态方法 invoke中的第一参数传null即可


            Console.ReadKey();
        }
    }
posted @ 2023-01-10 00:00  libaisheng9723  阅读(19)  评论(0)    收藏  举报