这节讲一下.NET 中的一个技术:反射(Reflection)。
反射是一种很重要的技术,它可以在程序运行时,动态的获取类的实例,并调用实例中的任何方法。它就像一面镜子,映射出一个类的所有细节。
typeof
说反射之前,要先知道typeof这个关键字,它是反射的核心,typeof可以动态的获取某个类的类型信息,反射通过这些类型信息,就可以生成实例等一些操作。
Reflection
反射的命名空间位于System.Reflection,下面开始演示反射的代码(动态的创建实例对象):
有以下一个接口和实现类做演示:
interfaceIReflection { void Show(); } class ReflectionTest : IReflection { public string Name { get; set; } public void Show() { Name = "Margaret Mitchell"; Console.WriteLine("Gone with the wind"); } }
在主方法中使用反射技术,获取实例,调用方法:
Type type = typeof(ReflectionTest); object o = Activator.CreateInstance(type); MethodInfo method = type.GetMethod("Show"); method.Invoke(o, null); PropertyInfo p = type.GetRuntimeProperty("Name"); Console.WriteLine(p.GetValue(o));
使用typeof获取类的类型信息,返回值是Type类型,使用反射命名空间下的Activator类,调用方法创建实例,返回值是object类型,调用type的GetMethod方法获取指定名称的方法,返回方法信息,调用方法信息的Invoke()传入实例对象,第二个参数是方法所需参数,无参方法就传null。获取属性也是同理,接下来看一下运行结果:
这跟new实例相同,但是这样直接比较的话,使用new实例要更便捷,代码量也更少,但是通过反射,我们可以实现更松的耦合,同时可以动态的实例类对象。当然,反射一般不会这么直接使用,一般都是将其封装起来,基于反射,编写一些框架,有个很好的反射的例子就是依赖注入(ASP.NET Core中的核心基础之一就是依赖注入,参见前文:依赖倒置原则)。像Spring 框架中也用到了反射以及依赖注入。
在Attribute特性 这一节中,也涉及到反射的内容,通过Type获取特性信息,从而根据特性信息判断该执行哪些操作,或者实例化特性类,进行相关操作。
反射是.NET 中的一个技术,但它在使用中又是隐式的,所以本篇文章只能是管中窥豹,若要了解更多,读者可以阅读一些源码,或者查看官方文档,获取更多关于Type类及反射的用法。
官方文档地址:https://docs.microsoft.com/zh-cn/dotnet/framework/reflection-and-codedom/reflection
个人公众号,热爱分享,知识无价。