关于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框架提供了一个开发平台,用于整合其他技 ...
随机推荐
- 【pytorch】从零开始,利用yolov5、crnn+ctc进行车牌识别
笔者的运行环境:python3.8+pytorch2.0.1+pycharm+kaggle用到的网络框架:yolov5.crnn+ctc项目地址:GitHub - WangPengxing/plate ...
- 多重断言插件之pytest-assume的简单使用
背景: pytest-assume是Pytest框架的一个扩展,它允许在单个测试用例中多次断言.通常情况下,当一个断言失败时,测试会立即停止执行,而pytest-assume允许我 们继续执行剩余的断 ...
- LeetCode952三部曲之一:解题思路和初级解法(137ms,超39%)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 题目描述 难度:困难 编程语言:Java 给定一个由不 ...
- Htttpclien循环自动生成图片,同时发送参数和文件,模拟http的post请求
package org.jeecg.modules.bussiness.PostTests; import com.sun.tools.internal.xjc.reader.xmlschema.bi ...
- Oracle主键自增列
SQL Server创建主键自增列我们可以使用"ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY"一步到位创建,而Oracle创建主键自增列和SQ ...
- Solution Set -「ARC 109」
「ARC 109A」Hands Link. 讨论即可,除了煞笔出题人写了个死马的题面. #include<cstdio> #include<algorithm> using n ...
- CAS中ABA问题的解决
转自(here) CAS问题的产生 在运用CAS做Lock-Free操作中有一个经典的ABA问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A ...
- 其它——Redis与Mysql双写一致性方案解析
文章目录 一 前言 二 一致性方案 三 先更新数据库,再更新缓存 四 先删缓存,再更新数据库 五 先更新数据库,再删缓存 一 前言 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取 ...
- Django框架——forms组件、cookie与session
文章目录 1 forms 组件 1 校验字段功能 2 渲染标签功能 渲染方式1 渲染方式2 渲染方式3 3 渲染错误信息功能 视图 模板 4 组件的参数配置 5 局部钩子 6 全局钩子 2 cooki ...
- 软件开发人员 Kubernetes 入门指南|Part 2
在第 1 部分中,我们讲解了 Kubernetes 的核心组件,Kubernetes 是一种开源容器编排器,用于在分布式环境中部署和扩展应用程序:我们还讲解了如何在集群中部署一个简单的应用程序,然后更 ...