C#_特性反射详解

news2024/9/22 21:30:23

特性是什么?

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

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

反射是什么?

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

字面理解:程序运行时,被加载到内存中,就会产生应用程序域(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
    {

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

入门必看!亚马逊新品上架如何快速提升产品排名?

对于有经验的亚马逊卖家来说&#xff0c;各种套路已经玩的出神入化&#xff0c;但对于新手卖家来说&#xff0c;可能并不清楚亚马逊新品上架时应该去冲产品排名&#xff0c;更不知道怎么提升产品排名。所以今天&#xff0c;大白就为亚马逊新手卖家带来了亚马逊新品上架该如何提…

VR/AR/眼镜投屏充电方案(LDR6020)

VR眼镜即VR头显&#xff0c;也称虚拟现实头戴式显示设备&#xff0c;随着元宇宙概念的传播&#xff0c;VR眼镜的热度一直只增不减&#xff0c;但是头戴设备的续航一直被人诟病&#xff0c;如果增大电池就会让头显变得笨重影响体验&#xff0c;所以目前最佳的解决方案还是使用VR…

富士施乐S1810 放大或缩小复印方法

1、放置原稿 将原稿放置在稿台玻璃上。&#xff08;A3纸横向平铺&#xff09; 2、设置原稿尺寸 按下“原稿尺寸”键&#xff0c;将显示区调整为横向A3&#xff0c;如图&#xff1a; &#xff08;请务必确认是否与外观图的原稿尺寸显示区所显示的原稿尺寸和方向匹配。&#xf…

直播小程序源码有用的协议知识:MQTT协议

MQTT协议分析&#xff1a; MQTT协议中文全称为消息队列遥测传输协议&#xff0c;是一种实时通信协议&#xff0c;适用于物联网场景中。MQTT协议被应用到直播小程序源码平台中&#xff0c;确保了直播小程序源码平台音视频流的传输高效、低延迟&#xff0c;为直播小程序源码平台…

Springboot_Redis

Springboot默认使用lettuce操作redis,底层是netty jdeis并发差些 Redis的Template 分为两种, 一种是StringRedisTemplate&#xff0c;另一种是RedisTemplate 根据不同的数据类型&#xff0c;大致的操作也分为这5种&#xff0c;以StringRedisTemplate为例 stringRedisTempla…

Linux 终端命令之文件目录操作,对比Dos相关命令

目录 前言 基础命令&#xff08;文件目录相关的&#xff09; cd命令 【英文帮助】 【对应Dos命令】 pwd命令 【英文帮助】 【对应Dos命令】 ls命令 【英文帮助】 【对应Dos命令】 tree命令 【英文帮助】 【对应Dos命令】 mkdir命令 【英文帮助】 【对应Dos命令…

Linux下的Shell基础——文本处理工具(五)

前言&#xff1a; Linux Shell是一种基本功&#xff0c;由于怪异的语法加之较差的可读性&#xff0c;通常被Python等脚本代替。既然是基本功&#xff0c;那就需要掌握&#xff0c;毕竟学习Shell脚本的过程中&#xff0c;还是能了解到很多Linux系统的内容。 Linux脚本大师不是…

Android View动画之LayoutAnimation的使用

接前篇 Android View动画整理 &#xff0c;本篇介绍 LayoutAnimation 的使用。 参考《安卓开发艺术探索》。 View 动画作用于 View 。 LayoutAnimation 则作用于 ViewGroup &#xff0c; 为 ViewGoup 指定一个动画&#xff0c;ViewGoup 的子 View 出场时就具体动画效果。 简言…

YOLO目标检测——真实和人工智能生成的合成图像数据集下载分享

YOLO真实和人工智能生成的合成图像数据集&#xff0c;真实场景的高质量图片数据&#xff0c;图片格式为jpg&#xff0c;数据场景丰富。可用于检测图像是真实的还是由人工智能生成。 数据集点击下载&#xff1a;YOLO真实和人工智能生成的合成图像数据集120000图片数据说明.rar

【MYSQL8.0从入门到精通】

文章目录 MySQL 8.0一.MySQL的多表操作1.外键约束&#xff08;一对多&#xff09;2.外键约束&#xff08;多对多&#xff09; MySQL 8.0 一.MySQL的多表操作 1.外键约束&#xff08;一对多&#xff09; 方式1 在创建表的同时创建外键约束 -- 1.创建主表 create table if no…

聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化

聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化 目录 聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化&#xff0c;聚类结果可视化&#xff0c;MATLAB程…

【GAMES 101】图形学入门——向量与变换(Vector Transform)

一、向量&#xff08;Vector&#xff09; 点乘&#xff08;Dot Product&#xff09; 定义&#xff1a;计算两个单位向量的夹角用途&#xff1a; 描述两个向量是否足够接近 叉乘&#xff08;Cross Product&#xff09; 定义&#xff1a;用于判断法向量的防线&#xff0c;一…

C语言:指针和数组(看完拿捏指针和数组)

目录 数组名的理解&#xff1a; 一维数组&#xff1a; 解析&#xff1a; 字符数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 字符串数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 一级指针&#xff1a; 解析&#xff1a; 解析&#xff1a; 二维数组&a…

minion在ubuntu上的搭建步骤

在Ubuntu上搭建MinIO可以按照以下步骤进行&#xff1a; 下载MinIO服务器二进制文件&#xff1a; 通过浏览器访问 https://min.io/download 或使用以下命令获取最新的MinIO二进制文件&#xff1a;wget https://dl.min.io/server/minio/release/linux-amd64/minio赋予二进制文件…

顺序表之初

欢迎来到我的&#xff1a;世界 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 线性表简介顺序表定义动态顺序表的初始化尾插头插Cheak 判断是否增容尾删&#xff1a;头删&#xff1a;打印在pos位置前插入x删除pos位置的值查…

Matlab之智能优化算法函数调用

1.句柄函数 句柄函数即我们要求的目标函数&#xff0c;以下三种算法的调用仅是求解最小值&#xff0c;若要求目标函数的最大值&#xff0c;可在返回结果中加负号。 function value Get_Fitness(x,y)value x^2 y^2;% 若要求x^2 y^2最大值可设value -(x^2 y^2); end句柄函数…

WPF基础入门-Class6-WPF通知更改

WPF基础入门 Class6-WPF通知 1、显示页面&#xff1a; <Grid><StackPanel><TextBox Text"{Binding Name}"></TextBox><TextBox Text"{Binding Title}"></TextBox><Button Command"{Binding ShowCommand}&qu…

VUE笔记(一)初识vue

一、vue的简介 1、什么是vue 官网地址:Vue.js Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。 构建用户界面&#xff1a;之前在学习vue之前通过原生js对DOM操作进行构建用户界面的 使用原生js构建用户界面的不足 - 没有规范&#xff0c…

mysql sql 执行流程

监控查询缓存的命中率 show status like ‘%qcache%’; mysql 缓存机制&#xff0c;以及 8.0 为啥取消 select sql_NO_Cache * from 表 where xxx; # 不使用缓存

如何开发一款唯一艺术平台 区块链 /数字藏品

艺术作品是人类文化的瑰宝&#xff0c;而艺术平台则是连接艺术家与观众的桥梁。如何开发一款独一无二的艺术平台&#xff0c;既要满足专业艺术作品展示的要求&#xff0c;又要提供深度思考的空间&#xff0c;这是我们所面临的挑战。本文将从专业性、思考深度和逻辑性等多个方面…