C# 反射机制详解

这篇具有很好参考价值的文章主要介绍了C# 反射机制详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0. 基础概念

0.1 什么是反射

Reflection,中文翻译为反射。
这是.Net中获取运行时类型信息的方式。

官方定义:
审查元数据并收集关于它的类型信息的能力。
元数据(编译以后的最基本数据单元)
就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。

.Net的应用程序的结构由以下几个部分组成:

  • 程序集(Assembly)

  • 模块(Module)

  • 类型(class)

C# 反射机制详解

而反射的层次模型也类似上述结构:

  • 程序集反射
  • 类型反射
  • 类型成员反射

C# 反射机制详解

而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。

  • Assembly类
    可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。

  • Type类
    可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等
    通过Type类可以得到这些要素的信息,并且调用。

  • MethodInfo
    包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等等
    并且可以调用。

诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。

0.2 命名空间与装配件的关系

  • 命名空间类似与Java的包,但又不完全等同
    因为Java的包必须按照目录结构来放置,命名空间则不需要。
  • 装配件是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件。

装配件和命名空间的关系不是一一对应,也不互相包含
一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在。

例如:

装配件A:

namespace  N1
{
      public  class  AC1  {…}
      public  class  AC2  {…}
}
namespace  N2
{
      public  class  AC3  {…}
      public  class  AC4{…}
}

装配件B:

namespace  N1
{
      public  class  BC1  {…}
      public  class  BC2  {…}
}
namespace  N2
{
      public  class  BC3  {…}
      public  class  BC4{…}
}

这两个装配件中都有N1和N2两个命名空间,而且各声明了两个类,这样是完全可以的

然后我们在一个应用程序中引用装配件A
那么在这个应用程序中,我们能看到N1下面的类为AC1和AC2,N2下面的类为AC3和AC4。

接着我们去掉对A的引用,加上对B的引用
那么我们在这个应用程序下能看到的N1下面的类变成了BC1和BC2,N2下面也一样。

如果我们同时引用这两个装配件
那么N1下面我们就能看到四个类:AC1、AC2、BC1和BC2。

装配件是一个类型 “居住” 的地方,那么在一个程序中要使用一个类,就必须告诉编译器这个类住在哪儿,编译器才能找到它,也就是说必须引用该装配件。

那么如果在编写程序的时候,也许不确定这个类在哪里,仅仅只是知道它的名称,就不能使用了吗?
答案是可以,这就是反射了,就是在程序运行的时候提供该类型的地址,而去找到它。

0.3 使用反射的情景

举个例子来说明:
很多软件开发者喜欢在自己的软件中留下一些接口,其他人可以编写一些插件来扩充软件的功能。

比如我有一个媒体播放器,我希望以后可以很方便的扩展识别的格式,那么我声明一个接口:

public  interface  IMediaFormat
{
   string  Extension  {get;}
   Decoder  GetDecoder();
}

这个接口中包含一个Extension属性,这个属性返回支持的扩展名。
另一个方法返回一个解码器的对象(这里我假设了一个Decoder的类,这个类提供把文件流解码的功能,扩展插件可以派生之),通过解码器对象我就可以解释文件流。

那么我规定所有的解码插件都必须派生一个解码器,并且实现这个接口,在GetDecoder方法中返回解码器对象,并且将其类型的名称配置到我的配置文件里面。

这样的话,我就不需要在开发播放器的时侯知道将来扩展的格式的类型,只需要从配置文件中获取现在所有解码器的类型名称,而动态的创建媒体格式的对象,将其转换为IMediaFormat接口来使用。

这就是一个反射的典型应用。

1. 反射的用途

反射的作用:

  • 它允许在运行时查看属性(attribute&#文章来源地址https://www.toymoban.com/news/detail-470970.html

到了这里,关于C# 反射机制详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中的Reflection(反射)、暴力反射

    1.1 反射的出现背景 Java程序中,所有的对象都有两种类型: 编译时类型 和 运行时类型 ,而很多时候对象的编译时类型和运行时类型 不一致 。 例如: 如上 :某些变量或形参的声明类型是 Object 类型,但是程序却需要调用该对象运行时类型的方法,该方法不是Object中的方法

    2024年02月04日
    浏览(44)
  • C#的反射机制

    当谈到C#的反射机制时,它提供了一种 动态 地在运行时获取和操作类型信息的能力。通过反射,可以 在编译时未知的情况下 ,使用类型信息来创建对象、调用方法、访问属性和字段等。下面是一些反射机制的重要概念和用法: Type 类型:Type 类型表示在代码中定义的类型(

    2024年02月10日
    浏览(50)
  • .net反射(Reflection)

    .NET 反射(Reflection)是指在运行时动态地检查、访问和修改程序集中的类型、成员和对象的能力。通过反射,你可以在运行时获取类型的信息、调用方法、访问字段和属性,以及创建对象实例,而无需在编译时知道这些类型的具体信息。 换句话说,反射可以在类的内部成员不

    2024年04月25日
    浏览(37)
  • 【C#】反射机制,动态加载类文件

    【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663 【C#】组件化开发,调用dll组件方法 本文链接

    2024年02月11日
    浏览(60)
  • 关于C#反射概念,附带案例!

    C#中的反射是一种使程序在运行时能够动态地获取类型信息并调用其成员的技术。通过反射,程序可以在运行时进行类型的动态加载、创建对象、调用方法和属性,以及访问和修改字段等。反射可以使程序更加灵活,但也增加了一定的性能开销。 在C#中,反射主要是通过Syst

    2024年02月05日
    浏览(35)
  • Reflection java反射源码分析

    Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种 动态获取程序信息 以及 动态调用对象的功能 称为Java语言的反射机制。反

    2024年02月02日
    浏览(42)
  • [Unity/URP学习]反射探针(Reflection Probe)

    传统上,游戏使用一种称为_反射贴图_的技术来模拟来自对象的反射,同时将处理开销保持在可接受的水平。此技术假定场景中的所有反射对象都可以“看到”(因此会反射)完全相同的周围环境。如果游戏的主角(比如闪亮的汽车)处于开放空间中,此技术将非常有效,但

    2023年04月09日
    浏览(35)
  • 什么是反射机制

    1.什么是类对象: 所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。 比方有一个Hero类:类对象就是用于描述这种类,都有什么属性,什么方法的。 获取类对象有3种方式 Class.forName Hero.class new Hero().get

    2024年02月05日
    浏览(37)
  • Java反射机制是什么?

    Java 反射机制 是 Java 语言的一个重要特性。 在学习 Java 反射机制前,大家应该先了解两个概念,编译期和运行期。 编译期 是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把

    2024年02月12日
    浏览(38)
  • 什么是Java中的反射机制?

    Java中的反射机制是一种能够在运行时动态地获取类的信息并操作类或对象的能力。Java中的每个对象都有一个getClass()方法,该方法可以返回该对象所属的类的Class对象。反射机制通过这个Class对象可以获取类的属性、方法、构造函数等信息,然后可以在运行时动态地创建对象、

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包