当前位置: 首页 > news >正文

C#_特性反射详解

特性是什么?

为程序元素额外添加声明信息的一种方式。

字面理解:相当于把额外信息写在干胶标签上,然后将其贴在程序集上。

反射是什么?

反射是一种能力,运行时获取程序集中的元数据。

字面理解:程序运行时,被加载到内存中,就会产生应用程序域(AppDomain),里面就是Assembly(程序集);反射就是读取程序集中的元数据。

元数据(metadata):是用来描述数据的数据或者叫做信息的信息,就是程序集中的类、属性、方法、特性等的说明信息。

应用案例

namespace MyWorkBook.MyTest
{public partial class FormAttribute : Form{private List<Type> heroTypes; //保存所有英雄类的类型private object selectedHero;  //当前选择的英雄对象public FormAttribute(){InitializeComponent();//加载所有英雄的类型--通过当前执行代码的程序集,获取程序集中所有类型,根据自定义特性进行筛选英雄并转换成集合类型,heroTypes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.GetCustomAttributes(typeof(HeroAttribute),false).Any()).ToList();//初始化英雄列表heroListBox.Items.AddRange(heroTypes.Select(t => t.Name).ToArray());}private void heroListBox_SelectedIndexChanged(object sender, EventArgs e){if (heroListBox.SelectedIndex == -1) return;//如果未选定任何项退出//创建当前选择的英雄对象var selectedHeroType = heroTypes[heroListBox.SelectedIndex];//根据当前选中项获取索引(集合下标)。selectedHero = Activator.CreateInstance(selectedHeroType);////获取该英雄类型的所有技能方法var skillMethods = selectedHeroType.GetMethods().Where(m => m.GetCustomAttributes(typeof(SkillAttribute),false).Any()).ToList();//初始化技能列表skillListBox.Items.Clear();skillListBox.Items.AddRange(skillMethods.Select(m => m.Name).ToArray());}/// <summary>/// 双击组件(技能列表)触发事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void skillListBox_DoubleClick(object sender, EventArgs e){if(skillListBox.SelectedIndex == -1) return;//获取当前选择的技能方法var selectedSkillMethed = selectedHero.GetType().GetMethod(skillListBox.SelectedItem.ToString());//调用该技能方法selectedSkillMethed?.Invoke(selectedHero, null);}}[Hero]//②贴上标签class 段誉{[Skill]public void 六脉神剑(){MessageBox.Show("段誉 - 六脉神剑", "提示");}[Skill]public void 凌波微步(){MessageBox.Show("段誉 - 凌波微步", "提示");}}[Hero]//②贴上标签class 萧峰{[Skill]public void 降龙十八掌(){MessageBox.Show("萧峰 - 降龙十八掌", "提示");}[Skill]public void 打狗棍法(){MessageBox.Show("萧峰 - 打狗棍法", "提示");}}[Hero]//②贴上标签class 虚竹{[Skill]public void 小无相功(){MessageBox.Show("虚竹 - 小无相功", "提示");}[Skill]public void 折梅手(){MessageBox.Show("虚竹 - 折梅手", "提示");}}/*①定义标签特性名规范:自定义名称+Attribute后缀类中没有任何成员(可以添加成员,通过反射获取),在反射代码中通过名称知道标签作用*/public class HeroAttribute : Attribute {}public class SkillAttribute : Attribute{}}

相关文章:

C#_特性反射详解

特性是什么&#xff1f; 为程序元素额外添加声明信息的一种方式。 字面理解&#xff1a;相当于把额外信息写在干胶标签上&#xff0c;然后将其贴在程序集上。 反射是什么&#xff1f; 反射是一种能力&#xff0c;运行时获取程序集中的元数据。 字面理解&#xff1a;程序运行…...

【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

时间复杂度和空间复杂度

全文目录 算法的复杂度时间复杂度大O渐进表示法空间复杂度常见算法复杂度对比 算法的复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度…...

mac docker 卡住解决

文章目录 1、问题简述2、重新安装docker3、docker守护进程4、问题解决方案 1、问题简述 在docker desktop上更改了daemon.json的文件内容&#xff0c;应该是参数写的有问题&#xff0c;修改完配置再启动docker desktop就失败了&#xff0c;然后想着卸载docker desktop&#xf…...

linux/centos zookeeper 使用记录

配置cfg 下载zookeeper-3.4.14.tar.gz负责到centos服务器解压 /xxx/zookeeper-3.4.14/conf/下创建zoo.cfg文件并配置以下属性&#xff0c;/bsoft/zookeeperdata/目录先预先创建 tickTime2000 initLimit10 syncLimit5 dataDir/bsoft/zookeeperdata/ clientPort2181zk启动/重启/关…...

用wireshark流量分析的四个案例

目录 第一题 1 2 3 4 第二题 1 2 3. 第三题 1 2 第四题 1 2 3 第一题 题目&#xff1a; 1.黑客攻击的第一个受害主机的网卡IP地址 2.黑客对URL的哪一个参数实施了SQL注入 3.第一个受害主机网站数据库的表前缀&#xff08;加上下划线例如abc&#xff09; 4.…...

Oracle 时区详解

1 简介 由于地球经纬度及地球自转引起的经度方向&#xff0c;不同的经度的地方&#xff0c;所感受到的昼夜是不同 的。有关国际会议决定将地球表面按经线从东到西,每隔经度15度划分一个时区,并且规定 相邻区域的时间相差1小时。 这就是时区的由来。 而实际使用中&#xff0c…...

仿mudou高性能高并发服务器

"这个结局是我的期待&#xff0c;我会一直为你祝福。" 项目实现目标: 仿muduo库One Thread One Loop式主从Reacto模型实现高并发服务器。通过实现高并发服务器组件&#xff0c;简洁快速完成搭建一个高性能服务器。并且&#xff0c;通过组件内提供的不同应⽤层协议⽀…...

vue权限管理——菜单权限设置

1.前提&#xff1a;后端提供菜单对应数据 此处用mockjs模拟 const menuList [{id: 1, path:/uploadSpec,authName: "上传spec", icon: User, children:[], rights:[view,add,edit,delete]},{id: 2, path:/showSpec, authName: "Spec预览", icon: DataAn…...

【LeetCode】228.汇总区间

题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b]…...

Qt快速学习(二)--QMainWindow,对话框,布局管理器,常用控件

目录 1 QMainWindow 1.1 菜单栏 1.2 工具栏 1.3 状态栏 1.4 铆接部件 1.5 核心部件&#xff08;中心部件&#xff09; 1.6 资源文件 2 对话框QDialog 2.1 基本概念 2.2 标准对话框 2.3 自定义消息框 2.4 消息对话框 2.5 标准文件对话框 3 布局管理器 3.1 系统…...

群晖DSM下套件及系统网页服务器ssl证书自动更新

关键字&#xff1a; DSM ssl 证书 起因 群晖下自建服务(alist3)和系统服务在外部网络访问需要加ssl安全证书来实现基础的传输保护。 申请证书和续期手动操作都还好&#xff0c;不算太麻烦&#xff0c;但是每个应用单独证书需要复制和重启&#xff0c;再配合服务重启一套下来就…...

【Flink】Flink架构及组件

我们学习大数据知识的时候&#xff0c;需要知道大数据组件如何安装以及架构组件&#xff0c;这将帮助我们更好的了解大数据组件 对于大数据Flink&#xff0c;架构图图下&#xff1a; 整个架构图有三种关键组件 1、Client&#xff1a;负责作业的提交。调用程序的 main 方法&am…...

React Navigation 开发准备

需要 React Native 使用 React Navigation 的话&#xff0c;我们需要首先安装如下几个包&#xff1a; npm install react-navigation/native npm install react-native-screens react-native-safe-area-context开发之前做一些处理 如果您使用的是 Mac 并针对 iOS 进行开发&am…...

前端面试:【前端安全】安全性问题与防范措施

嗨&#xff0c;亲爱的前端开发者&#xff01;在构建Web应用程序时&#xff0c;确保安全性是至关重要的。本文将深入讨论前端开发中的安全性问题&#xff0c;并提供一些防范措施&#xff0c;以确保你的应用程序和用户数据的安全性。 前端安全性问题&#xff1a; 跨站脚本攻击&am…...

[Linux]进程

文章目录 1. 进程控制1.1 进程概述1.1.1 并行和并发1.1.2 PCB1.1.4 进程状态1.1.5 进程命令 1.2 进程创建1.2.1 函数1.2.2 fork() 剖析 1.3 父子进程1.3.1 进程执行位置1.3.2 循环创建子进程1.3.3 终端显示问题1.3.4 进程数数 1.4 execl和execlp函数1.4.1 execl()1.4.2 execlp(…...

01-jupyter notebook的使用方法

一、Tab补全 在shell中输入表达式&#xff0c;按下Tab&#xff0c;会搜索已输入变量&#xff08;对象、函数等等&#xff09;的命名空间&#xff1a; 除了补全命名、对象和模块属性&#xff0c;Tab还可以补全其它的。当输入看似文件路径时 &#xff08;即使是Python字符串&…...

pytestx容器化执行引擎

系统架构 前端、后端、pytest均以Docker容器运行服务&#xff0c;单独的容器化执行引擎&#xff0c;项目环境隔离&#xff0c;即用即取&#xff0c;用完即齐&#xff0c;简单&#xff0c;高效。 前端容器&#xff1a;页面交互&#xff0c;请求后端&#xff0c;展示HTML报告 后…...

(动态规划) 剑指 Offer 42. 连续子数组的最大和 ——【Leetcode每日一题】

❓ 剑指 Offer 42. 连续子数组的最大和 难度&#xff1a;简单 输入一个整型数组&#xff0c;数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为 O(n)。 示例1: 输入: nums [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1…...

OLED透明屏曲面技术:创新突破引领显示行业未来

OLED透明屏曲面技术作为一项重要的显示技术创新&#xff0c;正在成为显示行业的焦点&#xff0c;其引人注目的优势和广泛应用领域使其备受关注。 本文将详细介绍OLED透明屏曲面技术的优势、应用领域以及市场前景&#xff0c;同时展望其未来的发展趋势&#xff0c;以期带给读者…...

HiveSQL实战:巧用前后函数(lag/lead)解析用户行为序列

1. 窗口函数与用户行为分析的完美结合 做数据分析的朋友们应该都遇到过这样的场景&#xff1a;老板让你分析用户从浏览商品到最终下单的平均时间间隔&#xff0c;或者找出那些在关键页面停留时间过长的流失用户。这类问题本质上都是在分析用户行为序列&#xff0c;而HiveSQL中的…...

数据库扩展实战:如何用ShardingCore实现高性能分库分表

数据库扩展实战&#xff1a;如何用ShardingCore实现高性能分库分表 【免费下载链接】sharding-core high performance lightweight solution for efcore sharding table and sharding database support read-write-separation .一款ef-core下高性能、轻量级针对分表分库读写分离…...

终极指南:3分钟掌握QMK Toolbox键盘固件刷写技巧

终极指南&#xff1a;3分钟掌握QMK Toolbox键盘固件刷写技巧 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox 你是否曾想过让你的机械键盘拥有独一无二的按键布局&#xff1f;或者想为心爱…...

3大突破:开源工具VideoCaptioner如何让零门槛实现AI实时字幕效率提升300%

3大突破&#xff1a;开源工具VideoCaptioner如何让零门槛实现AI实时字幕效率提升300% 【免费下载链接】VideoCaptioner &#x1f3ac; 卡卡字幕助手 | VideoCaptioner - 基于 LLM 的智能字幕助手&#xff0c;无需GPU一键高质量字幕视频合成&#xff01;视频字幕生成、断句、校正…...

HDF5文件可视化指南:用HDFView检查你的Python数据存储结果

HDF5文件可视化指南&#xff1a;用HDFView检查你的Python数据存储结果 当你用Python处理完一批数据并存入HDF5文件后&#xff0c;最让人忐忑的莫过于——数据真的按预期存储了吗&#xff1f;结构是否正确&#xff1f;数值有无异常&#xff1f;本文将带你用HDFView这款专业工具&…...

Langchain与Qwen结合:如何用Python构建一个智能问答机器人(含联网搜索功能)

Langchain与Qwen结合&#xff1a;如何用Python构建一个智能问答机器人&#xff08;含联网搜索功能&#xff09; 在人工智能技术快速发展的今天&#xff0c;构建一个能够理解自然语言并提供准确回答的智能系统已不再是遥不可及的梦想。通过结合Langchain框架和Qwen大语言模型&a…...

CVPR 2025前瞻:计算机视觉三大技术革新与应用场景

1. 三维重建&#xff1a;从实验室走向真实世界 记得我第一次接触三维重建技术是在2015年&#xff0c;当时还在用传统的SFM&#xff08;Structure from Motion&#xff09;方法处理无人机航拍图像。十年后的今天&#xff0c;看着CVPR 2025上涌现的新技术&#xff0c;不得不感叹…...

避开这3个坑!GD32 ADC用DMA搬运数据时,定时器触发配置的常见误区与调试技巧

避开这3个坑&#xff01;GD32 ADC用DMA搬运数据时&#xff0c;定时器触发配置的常见误区与调试技巧 在嵌入式开发中&#xff0c;ADC&#xff08;模数转换器&#xff09;的数据采集是一个基础但至关重要的功能。当我们需要高效、稳定地采集大量数据时&#xff0c;通常会使用DMA…...

硬件突破:用OpenCore Legacy Patcher实现旧Mac的焕新体验

硬件突破&#xff1a;用OpenCore Legacy Patcher实现旧Mac的焕新体验 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款强大的开源工具&#…...

别再让Bug溜走!手把手教你用SVA在UVM里给芯片验证加个“监控探头”

芯片验证工程师的"电子眼"&#xff1a;用SVA在UVM中构建智能监控体系 想象一下&#xff0c;你正在负责一个复杂SoC芯片的验证工作。随着设计规模不断扩大&#xff0c;传统的测试方法就像在黑暗的房间里寻找掉落的针——效率低下且容易遗漏关键问题。这时&#xff0c;…...