首页 > 其他 > 详细

反射(Reflection)

时间:2020-11-25 09:32:18      阅读:34      评论:0      收藏:0      [点我收藏+]

       定义:反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道

       示例:

 //Assembly===》 获取程序集的信息 方便我们想要获取那个类 并进行实例化
            //Type的方法===》获取类里面的具体字段 构造函数 方法 接口 枚举 事件
            //GetConstructor(), GetConstructors():返回ConstructorInfo类型,用于取得该类的构造函数的信息
            //GetParameters(),获取参数列表
            //GetEvent(), GetEvents():返回EventInfo类型,用于取得该类的事件的信息
            //GetField(), GetFields():返回FieldInfo类型,用于取得该类的字段(成员变量)的信息
            //GetInterface(), GetInterfaces():返回InterfaceInfo类型,用于取得该类实现的接口的信息
            //GetMember(), GetMembers():返回MemberInfo类型,用于取得该类的所有成员的信息
            //GetMethod(), GetMethods():返回MethodInfo类型,用于取得该类的方法的信息
            //GetProperty(), GetProperties():返回PropertyInfo类型,用于取得该类的属性的信息

            TestReflection testCase = new TestReflection();
            testCase._name = "沙僧";
            testCase.OnPush += Test;
            testCase.Isure("唐僧");
            //根据程序集来获取程序集内的类型
            Assembly testClassAssembly = Assembly.GetAssembly(typeof(TestReflection));
            Type testClass = testClassAssembly.GetType("Reflection.TestReflection");
            Console.WriteLine("******************GetConstructors,GetParameters******************");
            //通过typeof获取指定类的信息
            Type t = typeof(TestReflection);
            TestReflection obj = Activator.CreateInstance(t) as TestReflection;//根据获取到的类型来创建一个实例           
            ConstructorInfo[] count = t.GetConstructors(); //GetConstructors():返回ConstructorInfo类型,用于取得该类的构造函数的信息
            foreach (var item in count)
            {
                //获取每个构造函数的参数列表
                ParameterInfo[] paracount = item.GetParameters();
                foreach (var itempara in paracount)
                {
                    Console.WriteLine("参数:" + itempara.Name + " 参数类型:" + itempara.ParameterType);
                }
            }

            Console.WriteLine("******************GetField******************");
            //获取TestReflection类的字段信息
            FieldInfo _name = t.GetField("_name");
            Console.WriteLine("name:" + _name.Name);
            Console.WriteLine("value:" + _name.GetValue(testCase));//获取值的前提是这个字段要赋值,是空的你去取值会报错
            _name.SetValue(testCase, "1234");
            Console.WriteLine("修改后的值:" + testCase._name);

            Console.WriteLine("******************GetProperty******************");
            PropertyInfo[] GetPropertycount = t.GetProperties();
            foreach (var item in GetPropertycount)
            {
                item.SetValue(testCase, "12345");
                Console.WriteLine("属性:" + item.Name);
                Console.WriteLine(item.GetValue(testCase));
            }

            Console.WriteLine("******************GetMembers******************");
            MemberInfo[] GetMemberscount = t.GetMembers();
            foreach (var item in GetMemberscount)
            {
                Console.WriteLine("成员信息:" + item.Name);
            }

            Console.WriteLine("******************GetMethod******************");
            var GetMethodcount = t.GetMethod("TestFuncWithParam");
            // foreach (var item in GetMethodcount)
            //{                
            Console.WriteLine("方法名:" + GetMethodcount.Name);
            var result = GetMethodcount.Invoke(obj, new object[] { "a", "b" });//调用并接受结果
            obj.TestFuncWithParam("c","d");//经过强转可以直接调用 或者使用dynamic
            Console.WriteLine(result);
            var paraname = GetMethodcount.GetParameters();//获取参数列表
            foreach (var para in paraname)
            {
                Console.WriteLine($"我是{GetMethodcount}的参数{para}");
            }
            // }

            
            Console.ReadLine();

       总结:反射是一种高级特性,在平时的编码似乎也不是经常用到,但在搭建框架时考虑到灵活性会使用反射,如:mvc的管道模型中想一想我们只传入了控制器名和方法,框架是如何找到对应的类和方法的呢,还有core里面的IOC,我们传入接口类和实现类,在构造注入时内部是怎样创建具体实例保存在容器中呢?这些都用了反射来实现。带来灵活性,同时也会损失一部分性能,因为其不是直接调用方法。

反射(Reflection)

原文:https://www.cnblogs.com/wshnzxj/p/14033552.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!