反射

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 }

关于C#反射概念,附带案例!的更多相关文章

  1. js引出函数概念的案例

    js引出函数概念的案例   1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8&q ...

  2. C#反射概念以及实例详解【转】

    2009-08-28 13:12 佚名 互联网 我要评论(1) 字号:T | T C#反射概念以及实例向你介绍了C#反射的基本内容以及C#反射实例的简单应用,希望对你了解和学习C#反射以及C#反射实例 ...

  3. JAVA反射概念及使用详解(超详细)

    JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 ​ 好处: ​ ...

  4. Shiro 安全框架详解二(概念+权限案例实现)

    Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...

  5. Shiro 安全框架详解一(概念+登录案例实现)

    shiro 安全框架详细教程 总结内容 一.RBAC 的概念 二.两种常用的权限管理框架 1. Apache Shiro 2. Spring Security 3. Shiro 和 Spring Se ...

  6. Java进阶之reflection(反射机制)——反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  7. java反射 概念

    一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...

  8. OAF开发概念和案例总结(项目总结)

    留看: 网上关于OAF学习的资料比较少,最近有些时间,整理了下自己在项目上的经验总结和同学们一下共享一下 和学友一起讨论一下OAF开发,还有两个比较复杂的系列正在整理中..... 一.OAF EO定义 ...

  9. spring_01概念及案例

    1.什么是IOC? IOC概念:inverse of Controll,控制反转,所谓控制反转,就是把创建对象和维护对象关系的权利从程序中转移到spring的容器中(applicationContex ...

  10. Spring核心概念和案例

    一.Spring概念 1.Spring框架概述 轻量级的Java EE开源框架,它是由Rod Johnson为了解决企业应用程序开发的复杂性而创建, Spring框架提供了一个开发平台,用于整合其他技 ...

随机推荐

  1. Minio 安装部署

    minio 入门 简介 简介 自己看官网 https://min.io/docs/minio/kubernetes/upstream/ 安装部署 (1)Linux服务器安装 minio 可以采用以下几 ...

  2. 白话领域驱动设计DDD

    容我找个借口先,日常工作太忙,写作略有荒废.一直想聊下领域驱动设计,以下简称DDD,之前也看过一些教程,公司今年两个项目--银行核心和信用卡核心,都深度运用DDD成功落地,有人说DDD挺难理解,在此讲 ...

  3. PivotGridControl自定义行数据的统计公式

    我们在使用PivotGridControl进行数据统计的时候,用时候需要在不同的行使用不同的汇总公式的情况,本文就是为了说明怎么实现此功能,如下图说明 数据源: 注意:此时数据列指定的SummaryT ...

  4. 【译】ASP.NET Core在 .NET Core 3.1 Preview 1中的更新

    .NET Core 3.1 Preview 1现在可用.此版本主要侧重于错误修复,但同时也包含一些新功能. 这是此版本的ASP.NET Core的新增功能: 对Razor components的部分类 ...

  5. Skynet:Debug Console的扩展

    起因 最近上线服务器遇到了一些问题,上个月CPU暴涨的问题,那个经查验是死循环导致endless loop了. 这周又遇到了mem占用达到96%的问题,在debug console里调用了gc之后,跌 ...

  6. 【matplotlib基础】--几何图形

    除了绘制各类分析图形(比如柱状图,折线图,饼图等等)以外,matplotlib 也可以在画布上任意绘制各类几何图形.这对于计算机图形学.几何算法和计算机辅助设计等领域非常重要. matplitlib ...

  7. nacos2.X版本无法注册的几个原因以及解决方案(踩坑避雷!)

    在使用nacos+dubbo 注册服务的时候 遇到了无法注册的问题 记录一下踩的坑以及解决方案 com.alibaba.nacos.api.exception.NacosException: Requ ...

  8. c++ 常用的 STL

    c++ 中常用的 STL vector //vector 变长数组 倍增的思想(倍增:系统为每一个程序分配空间的时候,所需要的时间和空间大小无关,与请求次数相关)尽量减少请求的次数 /* 返回元素的个 ...

  9. xftp 7必须更新最新版本怎么解决

    下载可以查看16进制的软件: Sublime Text 运行XFTP7 双击打开是:这样的 解决方案 用Sublime Text进行打开nslicense.dll, 打开之后查找"0f88 ...

  10. CSE 2023 混合年度回声周末

    CSE 2023 混合年度回声周末(2023 年 4 月 13 日至 15 日)25 周年银周年纪念版 近 900 名参与者参加.又是成功的伟大一年.明年 2024 年 4 月在多伦多见.敬请关注全年 ...