反射

一、反射的概述

通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象。 

反射机制允许程序在执行过程中动态地添加各种功能。 

二、通过反射创建对象

创建一个类

using System;

namespace StudentTest
{
    public class Student
    {
        public string Name { get; set; }
        public Student()
        {
            Console.WriteLine("我是无参构造函数");
        }
        public Student(int v)
        {
            Console.WriteLine("我是有参构造函数");
        }
    }
}

 

通过反射创建Student对象,调用里面的方法

 static void Main(string[] args)
        {
            //加载dll文件
            Assembly assembly = Assembly.LoadFrom("StudentTest.dll");
            //Student
            Type type = assembly.GetType("StudentTest.Student");
            //创建对象
            object obj = Activator.CreateInstance(type);
            var student = obj as Student;
            student.Test();
            Console.ReadLine();
        }

二、通过反射创建有参对象

 static void Main(string[] args)
        {
            //加载dll文件
            Assembly assembly = Assembly.LoadFrom("StudentTest.dll");
            //Student
            Type type = assembly.GetType("StudentTest.Student");
            
            //获取对象下的所有构造方法
            foreach(ConstructorInfo constructorInfo in type.GetConstructors())
            {
                Console.WriteLine(constructorInfo.Name);
                //获取构造方法的所有参数类型
                foreach(var parameterInfo  in constructorInfo.GetParameters())
                {
                    Console.WriteLine(parameterInfo.ParameterType);

                }
            }
            //创建有参构造函数
            object obj1 = Activator.CreateInstance(type,new object[] { 111});
            Console.ReadLine();
        }

三、通过反射创建私有对象

//加载dll文件
            Assembly assembly = Assembly.LoadFrom("StudentTest.dll");
            //Student
            Type type = assembly.GetType("StudentTest.Teacher");
            //创建私有构造函数
            object obj1 = Activator.CreateInstance(type,true);
            Console.ReadLine();

四、通过反射创建泛型类

 //加载dll文件
            Assembly assembly = Assembly.LoadFrom("StudentTest.dll");
            //Student
            Type type = assembly.GetType("StudentTest.GenericClass");
            Type makeType = type.MakeGenericType(new Type[] {typeof(int) });

            //创建泛型对象
            object obj1 = Activator.CreateInstance(makeType);

 五、通过反射调用方法

static void Main(string[] args)
        {
            //加载dll文件
            Assembly assembly = Assembly.LoadFrom("StudentTest.dll");
            //Student
            Type type = assembly.GetType("StudentTest.Student");
            //得到所有方法
            foreach (var MethodInfo in type.GetMethods())
            {
                Console.WriteLine(MethodInfo.Name);
                //得到方法参数
                foreach (var item in MethodInfo.GetParameters())
                {
                    Console.WriteLine(MethodInfo.Name + " " + item.ParameterType);
                }
            }
            object obj = Activator.CreateInstance(type);
            //MethodInfo methodInfo = type.GetMethod("Test1");
            //methodInfo.Invoke(obj,null);
            //有参数
            //MethodInfo methodInfo = type.GetMethod("Test2");
            //methodInfo.Invoke(obj,new object[]{111});
            //重载方法调用
            //MethodInfo methodInfo = type.GetMethod("Test3",new Type[] {typeof(int),typeof(string) });
            //methodInfo.Invoke(obj, new object[] { 111,"111"});
            //静态
            //MethodInfo methodInfo = type.GetMethod("Test4");
            //methodInfo.Invoke(obj, new object[] { 111 });

            //私有方法调用
            MethodInfo methodInfo = type.GetMethod("Test5", BindingFlags.Instance | BindingFlags.NonPublic);
            methodInfo.Invoke(obj, new object[] { 111 });
            Console.ReadLine();
        }
public class Student
    {
        public string Name { get; set; }
        public Student()
        {
            Console.WriteLine("我是无参构造函数");
        }
        public Student(int v)
        {
            Console.WriteLine("我是有参构造函数");
        }
        public void Test1()
        {
            Console.WriteLine("我是一个方法");
        }
        public void Test2(int id)
        {
            Console.WriteLine("我是一个有参方法");
        }
        public void Test3(int id,string name)
        {
            Console.WriteLine("我是一个重载int string方法");
        }
        public void Test3(int id, int name)
        {
            Console.WriteLine("我是一个重载方法");
        }
        public static void Test4(int id)
        {
            Console.WriteLine("我是一个静态方法");
        }
    }

六、通过反射调用泛型方法

static void Main(string[] args)
        {
            //加载dll文件
            Assembly assembly = Assembly.LoadFrom("StudentTest.dll");
            //Student
            Type type = assembly.GetType("StudentTest.GenericClass2");

            object obj = Activator.CreateInstance(type);
            //泛型方法
            MethodInfo methodInfo = type.GetMethod("Test");
            var methodGeneric = methodInfo.MakeGenericMethod(new Type[] { typeof(int)});
            methodGeneric.Invoke(obj, new object[] { 11 });
            Console.ReadLine();
        }
    public class GenericClass2
    {
        public void Test<T>(T id)
        {
            Console.WriteLine("泛型方法");
        }
    }

七、通过反射调用泛型类泛型方法

static void Main(string[] args)
        {
            //加载dll文件
            Assembly assembly = Assembly.LoadFrom("StudentTest.dll");
            //Student
            Type type = assembly.GetType("StudentTest.GenericClass`1");
            Type type1 = type.MakeGenericType(new Type[] { typeof(int)});
            object obj = Activator.CreateInstance(type1);
            //泛型方法
            MethodInfo methodInfo = type1.GetMethod("Test");
            var methodGeneric = methodInfo.MakeGenericMethod(new Type[] { typeof(int)});
            methodGeneric.Invoke(obj, new object[] { 11 });
            Console.ReadLine();
        }
    public class GenericClass<T>
    {
        public void Test<T>(T id)
        {
            Console.WriteLine("泛型类泛型方法");
        }
    }

八、通过反射操作字段

static void Main(string[] args)
        {
            Student student = new Student
            {
                Id = 11,
                Name = "测试一哈"
            };
            //加载dll文件
            Assembly assembly = Assembly.LoadFrom("StudentTest.dll");
            //Student
            Type type = assembly.GetType("StudentTest.Student");
            object obj = Activator.CreateInstance(type);
            foreach(var prop in type.GetProperties())
            {
                Console.WriteLine($"{prop.PropertyType}+{prop.Name}+{prop.GetValue(student)}");
                if (prop.Name.Equals("Id"))
                {
                    prop.SetValue(student,22);
                }
                if (prop.Name.Equals("Name"))
                {
                    prop.SetValue(student, "哈哈哈");
                }
                Console.WriteLine($"{prop.PropertyType}+{prop.Name}+{prop.GetValue(student)}");
            }
            Console.ReadLine();
        }
 public class Student
    {
        public string Name { get; set; }
        public int Id { get; set; }
    }

 

posted @ 2021-05-12 23:08  昵称已存在嘿  阅读(30)  评论(0编辑  收藏  举报