C#_特性&反射详解

这篇具有很好参考价值的文章主要介绍了C#_特性&反射详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

特性是什么?

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

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

C#_特性&反射详解,C#秘籍,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#_特性&反射详解,C#秘籍,c#,开发语言

万物皆是对象,对象均可反射。

C#_特性&反射详解,C#秘籍,c#,开发语言 C#_特性&反射详解,C#秘籍,c#,开发语言

 内外部使用私有成员会打破对象的封装性,并且可能导致代码执行不稳定,所以一般情况不建议使用反射来访问私有成员;但是在某些场景使用反射是必要的,例如:

1.在某些调试场景需要访问私有成员来查找问题。

2.在测试代码时,需要访问私有成员来验证代码正确性。文章来源地址https://www.toymoban.com/news/detail-674877.html

到了这里,关于C#_特性&反射详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解ArkTS:Harmony OS 应用开发语言 TypeScript 的基础语法和关键特性

    Harmony OS应用开发的主力语言ArkTS的前身TS语言的基本语法。通过学习变量的声明和数据类型、条件控制、函数声明、循环迭代等基本知识,并了解内核接口的声明和使用。同时还介绍了模块化开发的概念,提高代码的复用性和开发效率。该对话还涉及了if else和switch条件控制语

    2024年02月04日
    浏览(46)
  • 自动驾驶嵌入式开发工程师:车载SOC开发修炼秘籍

    声明:本文档是博主在开发学习过程中写的笔记,本意是便于以后开发复盘,参考《 ug1144-petalinux-tools-reference-guide》、《ug1085》、黑金Zynq UltraScale+ MPSoC 5EV开发板资料、英伟达官方资料。 大佬勿喷 大佬勿喷 大佬勿喷!!! 赛灵思芯片在自动驾驶领域的应用:Xilinx/AMD提供了成

    2024年02月07日
    浏览(51)
  • .NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法

    前段时间有朋友问道一个这样的问题,.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类,然后通过依赖注入(DI)的方式获取对应服务的方法并通过反射动态执行类的方法,从而实现更灵活的编程

    2023年04月15日
    浏览(44)
  • Java高级实战--高级开发和架构师的秘籍

    本JavaWeb高级实战教程全网最强!本教程是 实际项目中真正会用到的技术 ,学完就能成为 真正的技术大佬 , 有亮点的大佬 !此教程包含: 高并发、项目架构、全局处理、自动化处理、链路追踪、应用监控 等,也包含 Spring、SpringMVC、SpringBoot、Redis、MQ 的 高级 用法等。 很多

    2024年01月25日
    浏览(41)
  • LLM 快人一步的秘籍 —— Zilliz Cloud,热门功能详解来啦!

    最近,我们发布了可处理十亿级向量数据的 Zilliz Cloud GA 版本,为用户提供开箱即用的向量数据库服务,大大降低了数据库的运维成本。 看过上一篇文章《可处理十亿级向量数据!Zilliz Cloud GA 版本正式发布》的朋友们知道,此次我们在进行版本更新的同时,也增加了多项新功

    2023年04月14日
    浏览(39)
  • 【小尘送书-第十一期】编程的基石,开发的核心:《算法秘籍》

    大家好,我是小尘,欢迎你的关注!大家可以一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 👨‍💻博主主页:小尘要自信 👨‍💻推荐专栏: 👨‍💻《1》开发环境配置攻略 👨‍💻《2》Java程序员的成长 👨‍💻《3》2023Java面试实

    2024年02月04日
    浏览(42)
  • 【Elasticsearch配置秘籍】详解config/elasticsearch.yml,解锁关键参数与实战应用

    Elasticsearch的强大性能与灵活性,很大程度上得益于其细致入微的配置选项。作为核心配置文件, config/elasticsearch.yml 扮演着至关重要的角色。本文将深度剖析该文件中的重要参数,结合实例说明其作用与应用场景,助您定制最适合业务需求的Elasticsearch集群。 一、基础配置项

    2024年04月11日
    浏览(35)
  • 【C语言趣味教程】(10) 分支语句 Ⅱ:switch 语句 | fall-through 效应 | default 子句 | else 特性详解 | else 匹配原则 | 悬空 else 隐患

        🔗 《C语言趣味教程》👈 猛戳订阅!!! 0x00 switch 的语法 📚 介绍: switch 语句是一种多分支语句,常常用于 \\\"多分支\\\" 的情况。 用于不同条件执行不同动作,每一个 case 分支都是唯一的,从上往下逐一测试直到匹配为止。 一个标准的 switch 语句由三部分组成: case

    2024年02月03日
    浏览(52)
  • Go语言之反射(反射的简单使用,原理)

    1.什么是反射 Go语言中,反射的机制就是在运行的时候,可以获取到其变量的类型和值,且可以对其类型和值进行检查,对其值进行修改。 即在不知道具体的类型的情况下,可以用反射机制来查看变量类型、更新变量的值。 Go中反射主要涉及到两个概念:Type和Value。对所有的

    2023年04月25日
    浏览(36)
  • 【研发日记】C/C++开发避坑秘籍(一)——CAN接收Buffer溢出Bug

    文章目录 背景介绍 问题描述 分析排查 解决方案 总结归纳         在一个嵌入式软件项目中,有一段使用C语言写的嵌入式代码,功能是把CAN总线上的几帧报文接收进来,并解析出数据。示例如下:         乍一看感觉挺简单,想着直接用一个while循环,周期提取CAN

    2024年04月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包