这节讲一下.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。获取属性也是同理,接下来看一下运行结果:

.NET 反射(Reflection)_.net

    这跟new实例相同,但是这样直接比较的话,使用new实例要更便捷,代码量也更少,但是通过反射,我们可以实现更松的耦合,同时可以动态的实例类对象。当然,反射一般不会这么直接使用,一般都是将其封装起来,基于反射,编写一些框架,有个很好的反射的例子就是依赖注入(ASP.NET Core中的核心基础之一就是依赖注入,参见前文:依赖倒置原则)。像Spring 框架中也用到了反射以及依赖注入。

    在Attribute特性 这一节中,也涉及到反射的内容,通过Type获取特性信息,从而根据特性信息判断该执行哪些操作,或者实例化特性类,进行相关操作。

    反射是.NET 中的一个技术,但它在使用中又是隐式的,所以本篇文章只能是管中窥豹,若要了解更多,读者可以阅读一些源码,或者查看官方文档,获取更多关于Type类及反射的用法。


    官方文档地址:https://docs.microsoft.com/zh-cn/dotnet/framework/reflection-and-codedom/reflection


 个人公众号,热爱分享,知识无价。

.NET 反射(Reflection)_.net_02