zoukankan      html  css  js  c++  java
  • .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

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

  • 相关阅读:
    BZOJ 1391: [Ceoi2008]order
    BZOJ 4504: K个串
    2019 年百度之星·程序设计大赛
    POJ 2398 Toy Storage (二分 叉积)
    POJ 2318 TOYS (二分 叉积)
    HDU 6697 Closest Pair of Segments (计算几何 暴力)
    HDU 6695 Welcome Party (贪心)
    HDU 6693 Valentine's Day (概率)
    HDU 6590 Code (判断凸包相交)
    POJ 3805 Separate Points (判断凸包相交)
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13796327.html
Copyright © 2011-2022 走看看