Unity3D C# 反射与特性的配合使用

news2024/11/24 19:42:48

需求分析

情况:

        假如我们是一个动物园的管理员,我们需要统计园内的所有动物动物的行为。

举例:

        现在园区内有猫、狗和鸡。猫对应的行为是喵喵喵卖萌,狗对应狗吠干饭,鸡对应篮球打鸣那么这时候我要统计这些,一般都是写一张大表,动物园进来一只新的动物就登记一下新成员的种类和行为。可是动物园每天进进出出的动物太多,久而久之我的这张大表就会越来越长,且不方便查找。

        有没有办法可以自动化生成这两张表呢?那么这里就可以考虑一下使用反射特性配合使用了。

思路:

         我们给每个动物的类添加一个【Animal】特性,每个动物的行为添加一个【Behavior】特性。我们可以在主程序当中通过反射来获取程序集中,找到所有带有【Animal】特性的类和对应【Behavior】特性的方法。根据反射的信息自动将它们分配到对应的表上去。如果后续有所变动,也只需增删类就可以了


代码解析

一、先写两个类,都继承Attribute。这里类的后缀不加Attribute也可以,只不过为了更加规范


二、动物的类(鸡类、狗类和猫类)

类的上方都有Animal特性,它们的方法上都有[Behaviour]特性


三、简单的界面设置一下(我这里用窗体,懒得打开Unity了)

如下图,左边的框框放的是动物的类型列表,右边是动物的行为列表

我选中哪一只动物右边列表就要显示选中的动物对应的行为。


四、附上源码

using System.Reflection;

namespace Attribute_Test
{
    public partial class MyTest : Form
    {
        private List<Type> _animTypes;   //保存所有动物类型
        private object _selectedAnim;    //当前选择的动物

        public MyTest()
        {
            InitializeComponent();

            //加载所有类型
            _animTypes = Assembly.GetExecutingAssembly().GetTypes().
                Where(t => t.GetCustomAttributes(typeof(AnimalAttribute), false).Any()).ToList();

            //初始化列表
            listBox_Role.Items.AddRange(_animTypes.Select(t => t.Name).ToArray());
        }

        /// <summary>
        /// 选中动物类型
        /// </summary>
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listBox_Role.SelectedIndex == -1) return;
            var selectedAnimType = _animTypes[listBox_Role.SelectedIndex];
            _selectedAnim = Activator.CreateInstance(selectedAnimType);

            //获取该动物的所有行为
            var handleMethods = selectedAnimType.GetMethods().
                Where(m => m.GetCustomAttributes(typeof(BehaviourAttribute), false).Any()).ToList();

            //初始化Handle列表
            listBox_Behaviour.Items.Clear();
            listBox_Behaviour.Items.AddRange(handleMethods.Select(m => m.Name).ToArray());
        }

        /// <summary>
        /// 选中行为类型
        /// </summary>
        private void listBox_Handle_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listBox_Behaviour.SelectedIndex == -1) return;
            //获取当前选择的行为方法
            var selectedHandleMethod = _selectedAnim.GetType().GetMethod(listBox_Behaviour.SelectedItem.ToString());

            //调用该行为的方法
            selectedHandleMethod?.Invoke(_selectedAnim, null);
        }

    }
}

五、功能展示

六、新增一只动物

再次运行以后,就可以发现列表里面多了一只只会吃(Eat)猴子(Monkey)

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

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

相关文章

【开发】视频监控系统/视频汇聚平台EasyCVR平台页面展示优化

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

怎么绘制骑鹅旅行记思维导图?教你这样绘制

怎么绘制骑鹅旅行记思维导图&#xff1f;骑鹅旅行记是一本经典的童话故事&#xff0c;绘制这个故事的思维导图可以帮助我们更好地理解故事情节和角色关系。那么今天就给大家介绍一种快速且简便的方法来绘制思维导图。 我们可以使用【迅捷画图】来进行制作&#xff0c;这是一种功…

深度学习笔记之优化算法(一)铺垫:梯度下降法VS最速下降法

深度学习笔记之优化算法——铺垫&#xff1a;梯度下降法VS最速下降法 引言回顾&#xff1a;条件数范数 相关描述关于梯度下降法最速下降法单位范数的描述 梯度下降法VS最速下降法梯度下降法等价于最速下降法的情况欧式范数约束产生的更新方向可能不是最优方向梯度下降法与最速下…

RayViz 一款服务于SolidWorks用于光学和机械设计的有效工具

RayViz 作为 SolidWorks 的一个扩展插件&#xff0c;不仅可以在 SolidWorks 工作环境中直接定义和保存模型光学属性&#xff0c; 而且还可以在该 CAD 工作环境中直接进行光线追迹。通过 RayViz, 把 TracePro 和 Solidworks 链接了起来&#xff0c; 一个模型可以在 TracePro 中用…

14.抽象工厂模式

UML 代码 #include <iostream> #include <list> using namespace std;class AbstractProductA { public:virtual void showa() 0; }; class ProductA1:public AbstractProductA { public:virtual void showa(){cout << "我是A1" << endl;}…

OpenHarmony Meetup常州站招募令

OpenHarmony Meetup 常州站正火热招募中&#xff01; 诚邀充满激情的开发者参与线下盛会~ 探索OpenHarmony前沿科技&#xff0c;畅谈未来前景&#xff0c; 感受OpenHarmony生态构建之路的魅力&#xff01; 线下参与&#xff0c;名额有限&#xff0c;仅限20位幸运者&#xff01…

【c++_containers】string的模拟实现

前言 在学习数据结构时&#xff0c;如何证明自己彻底掌握了一个容器的各种特性&#xff1f;最直接的办法就是自己写一个。下面我们将围绕下图展开对与string的深度了解&#xff1a; 一.string的成员变量 string是表示字符序列的对象&#xff0c;同时增加了专门用于操作单字节字…

2023Node.js零基础教程(小白友好型),nodejs新手到高手,(一)NodeJS入门

写在开始前 在无尽的代码汪洪中&#xff0c;闪耀着一抹绚丽的光芒。它叫做Web前端开发&#xff01; HTML是我们的魔法笔&#xff0c;是创造力的源泉。它将我们的思绪化为标签&#xff0c;将我们的想象变为元素。 在无尽的标签组合中&#xff0c;我们创造出独特的网页&#xff…

分享:大模型定向培养学徒来啦

模型定向培养学徒招募对象&#xff1a; 1.在读研究生学硕专硕均可 2.大数据、人工智能、统计学计算机、软件、数学等相关研究方向 3.具备Python编程基础机器学习基础 4.有深度学习自然语言处理基础优先 大模型定向培养学徒目标&#xff1a; 1.培养大模型prompt能力&#…

位图(bitmap)原理以及实现

大家好&#xff0c;我是蓝胖子&#xff0c;我一直相信编程是一门实践性的技术&#xff0c;其中算法也不例外&#xff0c;初学者可能往往对它可望而不可及&#xff0c;觉得很难&#xff0c;学了又忘&#xff0c;忘其实是由于没有真正搞懂算法的应用场景&#xff0c;所以我准备出…

Linux搭建Apache(秒懂超详细)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

C++ Primer (第五版)第一章习题部分答案

在我自学C过程中&#xff0c;我选择了CPrimer这本书&#xff0c;并对部分代码习题进行了求解以及运行结果。接下来几个月我将为大家定时按章节更新习题答案与运行结果: 目录 1.9编写程序,使用while循环将50到100的整数相加 1.10 除了运算符将运算对象的值增加1之外,还有一个…

leetcode522. 最长特殊序列 II(java)

最长特殊序列 题目描述枚举法代码演示 题目描述 难度 - 中等 leetcode522. 最长特殊序列 II 给定字符串列表 strs &#xff0c;返回其中 最长的特殊序列 的长度。如果最长特殊序列不存在&#xff0c;返回 -1 。 特殊序列 定义如下&#xff1a;该序列为某字符串 独有的子序列&a…

【STM32】IWDG—独立看门狗

基于stm32f103 基于《零死角玩转STM32—F103指南者》 一个12bit的递减计数器 STM32 有两个看门狗&#xff0c;一个是独立看门狗另外一个是窗口看门狗&#xff0c;独立看门狗号称宠物狗&#xff0c;窗口看门狗号称警犬。 独立看门狗是一个 12 位的递减计数器&#xff0c;当计…

数字孪生:助力机载软件构型管理

飞机机载软件具有研发周期长、版本更新频繁、相关工程资料密集等特性。由于各个系统的软件分别由不同供应商开发&#xff0c;其设计保障等级、设计架构、实现方法等方面都各有不同&#xff0c;对机载软件进行高效、规范的构型管理显得尤为重要。 Q&#xff1a;什么是构型管理&…

【张兔兔送书第一期:考研必备书单】

考研书单必备 《数据结构与算法分析》《计算机网络&#xff1a;自顶向下方法》《现代操作系统》《深入理解计算机系统》《概率论基础教程&#xff08;原书第10版》《线性代数&#xff08;原书第10版&#xff09;》《线性代数及其应用》赠书活动 八九月的朋友圈刮起了一股晒通知…

Idea新建项目配置Java3D 环境配置

&#xff08;一&#xff09;JDK配置 安装包的下载&#xff1a;1.可以去官网&#xff1a;JDK下载&#xff0c;进入官网页面Java Downloads | Oracle&#xff0c;然后点击Download Java。2.搜博客&#xff0c;可能会内含安装包链接。 ​ 2.在这个界面可以选择我们要安装的版本…

IEEE802.2之LLC(逻辑链路控制)

一、概念 IEEE 802.2 是一种用于局域网&#xff08;LAN&#xff09;和都会区域网&#xff08;MAN&#xff09;的数据链路层逻辑链路控制&#xff08;LLC&#xff09;的标准。它是 IEEE 802 系列标准中的一个组成部分&#xff0c;专门用于定义如何在数据链路层内进行帧的多路复用…

按摩软件仿东郊到家系统开发,上门预约系统;

按摩软件仿东郊到家系统开发&#xff0c;上门预约系统&#xff1b; 用户端、技师端、商家端&#xff0c;以及管理后台。上门预约的操作 1、技师管理。 技师满意度进行统一跟踪评估&#xff0c;进行分级管理&#xff0c;分级评估&#xff1b; 2、订单管理。 按订单状态分类筛选&…

Vue3动态显示时间

使用的是moment.js插件 关键字 vue3的 onMounted 和 onBeforeUnmount 声明周期 一个用来创建 一个用来销毁 创建什么呢? setInterval 函数 销毁时使用时 clearInterval清除定时器 1上代码 function formatTime() {const date moment();const year date.year();const m…