关于C#反射概念,附带案例!

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

反射

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

在C#中,反射主要是通过System.Reflection命名空间中的类来实现的。以下是一些常用的反射类和方法:

  1. Type类:Type类表示一个类型,可以通过其静态方法获取某个类型的Type对象,例如typeof关键字和Type.GetType()方法。Type类提供了许多有用的方法,如GetMethods()获取类型的所有方法,GetProperties()获取类型的所有属性等。

  2. MethodInfo类:MethodInfo类表示一个方法,可以通过Type类的GetMethods()方法获取一个类型的所有方法,然后使用MethodInfo对象来调用具体的方法。

  3. PropertyInfo类:PropertyInfo类表示一个属性,可以通过Type类的GetProperties()方法获取一个类型的所有属性,然后使用PropertyInfo对象来访问和修改具体的属性。

  4. FieldInfo类:FieldInfo类表示一个字段,可以通过Type类的GetFields()方法获取一个类型的所有字段,然后使用FieldInfo对象来访问和修改具体的字段。

反射的优点

虽然反射在性能和资源消耗方面存在一些开销,但它在应用中仍然具有一些重要的优势和用途,如下所示:

  1. 动态加载和调用:反射允许在运行时动态加载和调用类型、方法和成员。这对于需要动态扩展和插件化的应用程序非常有用,例如插件系统、脚本引擎等。通过反射,可以在运行时加载和使用不同的程序集和组件,从而使应用程序更具灵活性和可扩展性。

  2. 元数据操作:反射提供了一种方式来读取和操作类型的元数据,包括属性、字段、方法、特性等的信息。这使得我们可以在运行时动态获取和操作类型的结构和行为。这对于实现某些高级功能和框架,例如ORM(对象关系映射)、序列化库、依赖注入容器等非常有用。

  3. 可扩展的代码生成和编译:反射使得我们可以动态生成和编译代码。这对于一些需要在运行时动态生成和执行代码的场景非常有用,例如动态代理、AOP(面向切面编程)、代码生成器等。通过反射,我们可以在运行时创建并执行代码,从而实现更高级的代码生成和动态编程。

  4. 框架和工具的开发:反射是许多框架和工具的基础,例如单元测试框架、序列化库、ORM框架等。这些框架和工具需要在运行时通过反射来获取和使用类型的信息,并在不同的场景中动态调用和操作代码。通过反射,这些框架和工具可以更加灵活和通用,提供更高级的功能和扩展性。

需要强调的是,尽管反射在某些情况下会带来性能开销,但在大多数情况下,这些开销并不会对应用程序的整体性能产生显著的影响。在使用反射时,我们应该权衡其灵活性和便利性与性能之间的平衡,并根据实际需求来选择合适的方法和工具。

 

反射的案例

 1 private void bt_Test_Click(object sender, System.Windows.RoutedEventArgs e)
 2 {
 3 //反射
 4         // 获取MyClass类型的Type对象
 5         Type type = typeof(MyClass);
 6  7         // 创建MyClass对象
 8         object myClassObj = Activator.CreateInstance(type);
 9 10         // 获取MyMethod方法的MethodInfo对象
11         MethodInfo methodInfo = type.GetMethod("MyMethod");
12 13         // 调用MyMethod方法
14         methodInfo.Invoke(myClassObj, null);
15 16         //Log.Write(str.ToString(),HaagonLibrary.Log.Log.EnumLogType.Warning);
17 18         Type type = typeof(MyClass);
19 20         // 动态调用反射方法
21         object myClassObj = Activator.CreateInstance(type);
22         MethodInfo methodInfo = type.GetMethod("MyMethod");
23 24         var stopwatch = Stopwatch.StartNew();
25         for (int i = 0; i < 1000000; i++)
26         {
27             methodInfo.Invoke(myClassObj, null);
28         }
29         stopwatch.Stop();
30         Log.Write("动态调用耗时:" + stopwatch.ElapsedMilliseconds + " 毫秒",                        HaagonLibrary.Log.Log.EnumLogType.Warning);
31         // 静态调用反射方法
32         var myClass = new MyClass();
33 34         stopwatch.Restart();
35         for (int i = 0; i < 1000000; i++)
36         {
37             myClass.MyMethod();
38         }
39         stopwatch.Stop();
40         Log.Write("静态调用耗时:" + stopwatch.ElapsedMilliseconds + " 毫秒", HaagonLibrary.Log.Log.EnumLogType.Warning);
41     }
42 }
43 public class MyClass
44 {
45     public void MyMethod()
46     {
47         Console.WriteLine("Hello, Reflection!");
48     }
49 }

 文章来源地址https://www.toymoban.com/news/detail-753574.html

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

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

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

相关文章

  • 关于C#中的LINQ的延迟执行

    简介 Linq中的绝大多数查询运算符都有延迟执行的特性,查询并不是在查询创建的时候执行,而是在遍历的时候执行 实例: 运行结果: 可以看到,执行结果也验证上述的说明,查询创建后,并没有马上执行,而是在遍历对象时才执行,否则第二个遍历不会打印出40. 如果在查询

    2024年01月20日
    浏览(26)
  • PuppeteerSharp库在C#中的应用案例

    PuppeteerSharp是一个针对Google Chrome浏览器的高级API库,它允许我们使用C#来控制Chrome浏览器的,比如模拟用户行为操作、爬取网页内容等。本文将介绍如何使用PuppeteerSharp库在C#中实现下载千图网图片并保存为PDF文件的案例。 PuppeteerSharp 提供了一系列丰富的功能,包括但不限于:

    2024年02月01日
    浏览(34)
  • 关于C#中的Select与SelectMany方法

    Select 将序列中的每个元素投影到新表单。 实例1 实例2  SelectMany 将序列的每个元素投影到 IEnumerableT 并将结果序列合并为一个序列。 实例1: 可以理解为,selectmany将二维平展为一维,构建了一个新的集合 实例2 函数原型 public static System.Collections.Generic.IEnumerableTResult SelectMa

    2024年01月20日
    浏览(27)
  • 关于C#中的HashSet<T>与List<T>

    HashSetT 表示值的集合。这个集合的元素是无须列表,同时元素不能重复。由于这个集合基于散列值,不能通过数组下标访问。 ListT 表示可通过索引访问的对象的强类型列表。内部是用数组保存数据,不是链表。元素可重复,是有序列表,根据调用add的时间先后进行排序。每次

    2024年01月24日
    浏览(24)
  • Unity3D中的C#协程(概念、使用方法、底层原理)

             Unity3D 中的协程是针对 Unity3D 框架和 C# 编程语言定制的 ,具有便捷的使用方式和良好的效率。其他语言Python、Lua等也支持协程,但是底层实现的细节可能不同。在 Unity3D 引擎中, 协程被 Unity3D 引擎的主循环所驱动 。         协程(Coroutine)是一种编程概念

    2024年02月08日
    浏览(42)
  • 【C#进阶】C# 反射

    序号 系列文章 11 【C#基础】C# 预处理器指令 12 【C#基础】C# 文件与IO 13 【C#进阶】C# 特性 ✋ 大家好,我是writer桑,本章为大家介绍 C# 中的 反射 。 反射 指的是程序可以 访问,检测和修改 它本身状态或行为的一种行为。 其中访问的目标包括程序集 1 、模块和类型对象等。可

    2024年03月15日
    浏览(43)
  • HALCON的综合应用案例【01】: 3D 算法处理在 Visual Studio 2019 C# 环境中的集成实例

    HALCON 为一款比较流行的商业视觉处理软件,他提供了多种开发的模式,可以在HALCON中开发,也可以将HALCON的设计通过导出库的形式集成到其他开发环境里面,以方便系统集成。本文为笔者自己的一个3D 视觉检测项目,利用HALCON的3D 库开发算法,然后,将算法集成到 MS-VS-C#的环

    2024年02月06日
    浏览(34)
  • Java 中反射的概念、作用和特点,在什么情况下使用反射及使用实例

    反射(Reflection)是 Java 的一种特性,它可以让程序在运行时获取自身的信息,并且动态地操作类或对象的属性、方法和构造器等。通过反射功能,可以让我们在不知道具体类名的情况下,依然能够实例化对象,调用方法以及设置属性。 反射的作用有以下几点: 运行时探查类

    2024年02月06日
    浏览(37)
  • 【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列

    目录 1、单例模式 1.1、饿汉模式 2.1、懒汉模式  2、阻塞队列 2.1、BlockingQueue 阻塞队列数据结构 对框架和设计模式的简单理解就是,这两者都是“大佬”设计出来的,让即使是一个代码写的不太好的“菜鸡程序员”也能写出还可以的代码。 设计模式也可以认为是对编程语言语

    2024年03月23日
    浏览(82)
  • C#反射的学习,反射的一些注意事项,反射的一些使用代码的实例

    本文档写的的是C#中的反射常用的方式(附带示例代码)以及在使用的时候的一些注意事项。 C#中的反射是一种强大的机制,它允许在运行时动态地检查、访问和操作程序的元数据、类型信息和对象。以下是C#中反射常用的技巧和使用方式: 获取类型信息:使用Type类可以获取

    2024年02月06日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包