首页 > 编程语言 >关于C#反射概念,附带案例!

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

时间:2023-12-13 15:56:43浏览次数:28  
标签:反射 调用 Log 案例 C# 方法 附带 动态 Type

反射

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 }

 

标签:反射,调用,Log,案例,C#,方法,附带,动态,Type
From: https://www.cnblogs.com/chen233/p/17897313.html

相关文章

  • Linux系统中curl命令使用笔记
    在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,用来请求Web服务器,它的名字就是客户端(client)的URL工具的意思,可以说是一款很强大的http命令行工具,它支持文件的上传和下载,是综合传输工具。可以看出它的参数非常多,a-z的字母,几乎都用到了,参数这么说,功能肯定很强大......
  • Oracle删除指定用户下所有对象
     --.sql脚本--唯一注意的是下面的d:\dropuserobj.sql为操作的.sql;--用于删除当前用户的所有对象--usefordropallobjectsincurrentuser;setheadingoff;setfeedbackoff;spoold:\dropuserobj.sql;prompt--删除约束条件select'altertable'||table_name||'......
  • 国标GB28181安防监控系统/磁盘阵列EasyCVR(V.3.4)新亮点:免保活功能
    TSINGSEE青犀近日发布了EasyCVR安防管理平台的V.3.4版本,其中一大亮点就是很多朋友都在咨询的“免保活”功能,那么,什么是“免保活”功能?又该如何配置呢?在EasyCVR平台有个【按需直播】按钮,顾名思义,需要的时候才播。因此,当它被启用后,就只有在点播该视频时,平台分发出的FLV、HLS、RTS......
  • .net core 同步锁/异步锁
    一、同步锁privatestaticreadonlyobject_lock=newobject();///同步锁publicvoidTestLock(){lock(_lock){//需要处理的业务Console.Write("输出内容");......
  • UBUNTU 18.04.6 在编译linux内核的时候执行make ARCH=arm socfpga_defconfig设置默认
    在编译linux内核的时候执行makeARCH=armsocfpga_defconfig设置默认配置时报错bisonflexnotfound缺少文件:/bin/sh:1:bison:notfound 输入命令sudoapt-getinstallbison进行安装: /bin/sh:1:flex:notfound 输入命令 sudoapt-getinstallflex进行安......
  • ArgoCD Application CRD
    Application示例apiVersion:argoproj.io/v1alpha1kind:Applicationmetadata:name:guestbook#You'llusuallywanttoaddyourresourcestotheargocdnamespace.namespace:argocd#AddthisfinalizerONLYifyouwantthesetocascadedelete.......
  • net core 异步超时取消机制
    方法一:利用Task.WhenAnynamespaceConsoleApp1{internalclassProgram{staticvoidMain(string[]args){Console.WriteLine("Hello,World!");CancellationTokenSourcects=newCancellationTokenSource......
  • Codeforces Round 810 (Div. 2)
    基本情况A题秒了,B、C题死活看不懂题目。B.PartyProblem-B-Codeforces错误分析为啥看不懂题目,一方面是英语水平确实不够,另一方面就是图的意识不行,如果能看出来这题隐含的建图思想,就很有助于理解题目。正确思路题意有\(T\)组数据,每组数据给你一组\(n,m\)表示共......
  • OEM DBConsole manually
    Step1.Droptheexistingconfigurationifitishavingsysmanuseralreadypresent.SQL>Selectusernamefromdba_userswhereusername='SYSMAN';USERNAME------------------------------SYSMANThebelowcommandtodroptheexistingconfigu......
  • 【Python爬虫】Scrapy框架文件写入方式CSV,MYSQL,MongoDB_爬取新浪彩票双色球
    Spider代码爬取新浪彩票双色球页面数据,只爬取期号、红球、篮球classShuangseqiu11Spider(scrapy.Spider):name="shuangseqiu11"allowed_domains=["sina.com.cn"]start_urls=["https://view.lottery.sina.com.cn/lotto/pc_zst/index?lottoType=ssq&......