关于C#反射概念,附带案例!
反射
C#中的反射是一种使程序在运行时能够动态地获取类型信息并调用其成员的技术。通过反射,程序可以在运行时进行类型的动态加载、创建对象、调用方法和属性,以及访问和修改字段等。反射可以使程序更加灵活,但也增加了一定的性能开销。
在C#中,反射主要是通过System.Reflection命名空间中的类来实现的。以下是一些常用的反射类和方法:
Type类:Type类表示一个类型,可以通过其静态方法获取某个类型的Type对象,例如typeof关键字和Type.GetType()方法。Type类提供了许多有用的方法,如GetMethods()获取类型的所有方法,GetProperties()获取类型的所有属性等。
MethodInfo类:MethodInfo类表示一个方法,可以通过Type类的GetMethods()方法获取一个类型的所有方法,然后使用MethodInfo对象来调用具体的方法。
PropertyInfo类:PropertyInfo类表示一个属性,可以通过Type类的GetProperties()方法获取一个类型的所有属性,然后使用PropertyInfo对象来访问和修改具体的属性。
FieldInfo类:FieldInfo类表示一个字段,可以通过Type类的GetFields()方法获取一个类型的所有字段,然后使用FieldInfo对象来访问和修改具体的字段。
反射的优点
虽然反射在性能和资源消耗方面存在一些开销,但它在应用中仍然具有一些重要的优势和用途,如下所示:
动态加载和调用:反射允许在运行时动态加载和调用类型、方法和成员。这对于需要动态扩展和插件化的应用程序非常有用,例如插件系统、脚本引擎等。通过反射,可以在运行时加载和使用不同的程序集和组件,从而使应用程序更具灵活性和可扩展性。
元数据操作:反射提供了一种方式来读取和操作类型的元数据,包括属性、字段、方法、特性等的信息。这使得我们可以在运行时动态获取和操作类型的结构和行为。这对于实现某些高级功能和框架,例如ORM(对象关系映射)、序列化库、依赖注入容器等非常有用。
可扩展的代码生成和编译:反射使得我们可以动态生成和编译代码。这对于一些需要在运行时动态生成和执行代码的场景非常有用,例如动态代理、AOP(面向切面编程)、代码生成器等。通过反射,我们可以在运行时创建并执行代码,从而实现更高级的代码生成和动态编程。
框架和工具的开发:反射是许多框架和工具的基础,例如单元测试框架、序列化库、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#反射概念,附带案例!的更多相关文章
- js引出函数概念的案例
js引出函数概念的案例 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8&q ...
- C#反射概念以及实例详解【转】
2009-08-28 13:12 佚名 互联网 我要评论(1) 字号:T | T C#反射概念以及实例向你介绍了C#反射的基本内容以及C#反射实例的简单应用,希望对你了解和学习C#反射以及C#反射实例 ...
- JAVA反射概念及使用详解(超详细)
JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: ...
- Shiro 安全框架详解二(概念+权限案例实现)
Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...
- Shiro 安全框架详解一(概念+登录案例实现)
shiro 安全框架详细教程 总结内容 一.RBAC 的概念 二.两种常用的权限管理框架 1. Apache Shiro 2. Spring Security 3. Shiro 和 Spring Se ...
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- java反射 概念
一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...
- OAF开发概念和案例总结(项目总结)
留看: 网上关于OAF学习的资料比较少,最近有些时间,整理了下自己在项目上的经验总结和同学们一下共享一下 和学友一起讨论一下OAF开发,还有两个比较复杂的系列正在整理中..... 一.OAF EO定义 ...
- spring_01概念及案例
1.什么是IOC? IOC概念:inverse of Controll,控制反转,所谓控制反转,就是把创建对象和维护对象关系的权利从程序中转移到spring的容器中(applicationContex ...
- Spring核心概念和案例
一.Spring概念 1.Spring框架概述 轻量级的Java EE开源框架,它是由Rod Johnson为了解决企业应用程序开发的复杂性而创建, Spring框架提供了一个开发平台,用于整合其他技 ...
随机推荐
- svg动画 - 波浪动画
波浪 <path d="M 96.1271 806.2501 C 96.1271 806.2501 241.441 755.7685 384.5859 755.7685 C 529.8 ...
- 产品代码都给你看了,可别再说不会DDD(四):代码工程结构
这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...
- 论文解读(TAMEPT)《A Two-Stage Framework with Self-Supervised Distillation For Cross-Domain Text Classification》
论文信息 论文标题:A Two-Stage Framework with Self-Supervised Distillation For Cross-Domain Text Classificati ...
- 关于MySQL获取自增ID的几种方法
1. Select Max(id) From Table; 通过取表字段最大值的方式来获取最近一次自增id 缺点: 这种方法在多人操作数据库的软件上不可靠, 举个例子, 你刚插入一条记录. 当你在查询 ...
- 搭一下 Stable Diffusion WebUI
Preface 前不久看到好多朋友用上Stable Diffusion来做原画,然后又配合上了Chatgpt. 一直以来都想尝试一下,奈何2014款的双核mac跑个idea都发出了拖拉机的轰鸣声. 所 ...
- 大模型时代,如何快速开发AI应用
本文分享自华为云社区 <[云享问答]第3期:大模型时代,如何快速开发AI应用>,作者:华为云社区精选. 大模型快速普及应用的当下,AI浪潮汹涌而至,对于开发者来说,开发一款属于自己的AI应 ...
- Python socket实现简单聊天,同步输入和接收消息
查的资料很多都是必须等待接收数据后才能再次输入.做了修改,使用多线程的形式,实现一边输入,一边接收 服务端代码 import socket import threading import sys im ...
- 基于 Python 和 Vue 的在线评测系统
基于 Docker,真正一键部署 前后端分离,模块化编程,微服务 ACM/OI 两种比赛模式.实时/非实时评判 任意选择 丰富的可视化图表,一图胜千言 支持 Template Problem,可以添加 ...
- json数组格式问题
---恢复内容开始--- 使用jsonserver来模拟后台数据接口时犯了一个很低级的错误 找了很久没有发现有什么不对劲的地方,后来仔细发现原来是一个很细微的语法问题:}] 中间不能有逗号!! -- ...
- 小景的Dba之路--如何导出0记录表以及数据泵的使用
小景最近在系统压测相关的工作,其中涉及了数据备份导出的操作.今天的问题是:exp命令不会导出0记录表,那么我们探讨下如何导出0记录表以及数据泵的使用. 首先,我们先刨析一下问题现象及原因: 在 Ora ...