.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的反 ...
随机推荐
- flutter简易教程
跟Java等很多语言不同的是,Dart没有public protected private等关键字,如果某个变量以下划线 _ 开头,代表这个变量在库中是私有的.Dart中变量可以以字母或下划线开头,后 ...
- Django之cookie 与session组件
一.会话跟踪技术 1.1 什么是会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...
- 有意思!强大的 SVG 滤镜
想写一篇关于 SVG 滤镜的文章已久,SVG 滤镜的存在,让本来就非常强大的 CSS 如虎添翼.让仅仅使用 CSS/HTML/SVG 创作的效果更上一层楼.题图为袁川老师使用 SVG 滤镜实现的云彩效 ...
- Java中的IO流 - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的IO流-入门篇>,希望对大家有帮助,谢谢 由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...
- Java类集框架详细汇总-底层分析
前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...
- [图论]剑鱼行动:kruskal
剑鱼行动 目录 剑鱼行动 Description Input Output Sample Input Sample Output 解析 难点 代码 Description 给出N个点的坐标,对它们建立 ...
- 经常问到的 BFC 和 IFC 是什么?
什么是BFC?什么作用? Block Formatting Context 块盒子布局发生的区域,浮动元素和其他元素交互的区域 浮动定位和清除浮动的时候只会应用于同一个BFC内的元素.浮动不会影响其他 ...
- CSS3常见动画
一.是什么 CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块 即指元素从一种样式逐渐过渡为另一种样式的过程 常见的动画效果有很多,如 ...
- Vulkan移植GpuImage(三)从A到C的滤镜
前面移植了几个比较复杂的效果后,算是确认了复杂滤镜不会对框架造成比较大的改动,开始从头移植,现已把A到C的所有滤镜用vulkan的ComputeShader实现了,讲一些其中实现的过程. Averag ...
- Java【File类、递归】
File 1.在io包中 操作电脑中的文件和文件夹 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 我们可以使用File类的方法 创建一 ...