• .NET 反射(Reflection)


        这节讲一下.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

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

  • 相关阅读:
    ORACLE中order by造成分页不正确原因分析
    各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别
    Spring配置文件一直报错的根源所在
    java加密用到了BASE64Decoder时报错信息:Access restriction: The type BASE64Encoder is not accessible due to restrict
    Eclipse报错:An internal error occurred during: "Building workspace". Java heap space),卡死解决办法
    云数据库场景问题经典案例——分页优化
    DDL失败案例
    Java笔试题解答
    模拟购物车表格
    addTodo 模型
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13796327.html
Copyright © 2020-2023  润新知