.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
个人公众号,热爱分享,知识无价。

.NET 反射(Reflection)的更多相关文章
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- [整理]C#反射(Reflection)详解
本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...
- CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)
CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...
- 代理(Proxy)和反射(Reflection)
前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...
- Golang 反射reflection
反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字 ...
- C# 反射(Reflection)技术
本文参考自C#反射(Reflection)详解,纯属学习笔记,加深记忆 在介绍反射前,先介绍一个重要的知识点 .Net应用程序是由程序集(Assembly).模块(Module).类型 ...
- C#反射(Reflection)详解
1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...
- C# 反射Reflection——反射反射程序员的快乐
一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Ne ...
- Laravel学习笔记之PHP反射(Reflection) (上)
Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读 · 读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...
随机推荐
- Codeforces Round #574 (Div. 2) E. OpenStreetMap 【单调队列】
一.题目 OpenStreetMap 二.分析 对于二维空间找区间最小值,那么一维的很多好用的都无法用了,这里可以用单调队列进行查找. 先固定一个坐标,然后进行一维的单调队列操作,维护一个区间长度为$ ...
- LiberOJ #124. 除数函数求和 【整除分块】
一.题目 #124. 除数函数求和 二.分析 比较好的一题,首先我们要对题目和样例进行分析,明白题目的意思. 由于对于每一个$d$,它所能整除的数其实都是定的,且数量是$ \lfloor \frac{ ...
- 11、pass,is,位运算的补充
pass的补充 一般Python的代码是基于:和缩进来实现,Python中规定代码块中必须要有代码才算完整,在没有代码的情况下为了保证语法的完整性可以用pass代替 if 条件: pass else: ...
- python3 中is和==的区别
is 身份运算符,用来判断对象是否属于同一地址 (python内置函数id() 可以返回对象地址) == 比较运算符,用于判断值是否相同
- Python图像处理库——PIL
PIL全称Python Image Library,是python官方的图像处理库,包含各种图像处理模块.Pillow是PIL的一个派生分支,包含与PIL相同的功能,并且更灵活.python3.0之后 ...
- Linux系统浮动IP的配置
什么是浮动IP,为什么要配置浮动IP 首先说一下为什么要配置浮动IP. 原文链接:https://blog.csdn.net/readiay/article/details/53538085 现在有一 ...
- 文字变图片——GitHub 热点速览 v.21.14
作者:HelloGitHub-小鱼干 程序的力量,在 deep-daze 体现得淋漓尽致,你用一句话描述下你的图片需求,它就能帮你生成对应图片.同样的,appsmith 的力量在于你只要拖拽即可得到一 ...
- 【Android】修改Android Studio的SDK位置
解决SDK占用C盘空间问题 由于Android Studio默认会将环境下载到C盘,会导致C盘空间被大量占用. 对于C盘窘迫的童鞋非常不友好. 可以通过修改SDK位置的方式缓解C盘空间焦虑. 打开&q ...
- Dynamics CRM开发参考资料
Developer Guide for Dynamics 365 Customer Engagement https://docs.microsoft.com/en-us/dynamics365/cu ...
- OO第一单元作业——魔幻求导
简介 本单元作业分为三次 第一次作业:需要完成的任务为简单多项式导函数的求解. 第二次作业:需要完成的任务为包含简单幂函数和简单正余弦函数的导函数的求解. 第三次作业:需要完成的任务为包含简单幂函数和 ...