ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.NET 反射(Reflection)

2020-10-11 10:03:50  阅读:282  来源: 互联网

标签:反射 Reflection 方法 获取 实例 typeof NET type


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

 

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

标签:反射,Reflection,方法,获取,实例,typeof,NET,type
来源: https://www.cnblogs.com/charlesmvp/p/13796327.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有