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

需求分析

情况:

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

举例:

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

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

思路:

         我们给每个动物的类添加一个【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.hqwc.cn/news/112616.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在qml中将一个16进制表示的颜色加上透明度

在qml中&#xff0c;我们在指定控件的颜色时&#xff0c;可以直接通过16进制的字符串来表示&#xff0c;比如"#ff0000"; 这种方式也比较符合UI设计人员的使用习惯。 但是假如要在此颜色的基础上&#xff0c;加个透明度的话&#xff0c;就要重新计算一番&#xff0c;比…

腾讯云2核4G服务器5M带宽 218元一年 优惠价格明细表

腾讯云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G5M带宽服务器218元一年&#xff1a; 腾讯云2核4G服务器5M带宽收费 腾讯云2核4G服务器可以选择轻量应用服务器或者ECS云服务器&#xff0c;云服务器ECS是专业级云服务器&#xff0c;大多数使用…

deepin V23通过flathub安装steam畅玩游戏

deepin V23缺少32位库&#xff0c;在星火商店安装的steam,打开报错&#xff0c;无法使用&#xff01; 通过flathub网站安装steam,可以正常使用&#xff0c;详细教程如下&#xff1a; flathub网址&#xff1a;主页 | Flathub 注意&#xff1a;flathub下载速度慢&#xff0c;只…

小程序自定义tabbar

前言 使用小程序默认的tabbar可以满足常规开发&#xff0c;但是满足不了个性化需求&#xff0c;如果想个性化开发就需要用到自定义tabbar,以下图为例子 一、在app.json配置 先按照以往默认的形式配置&#xff0c;如果中间的样式特殊则不需要配置 "tabBar": {&qu…

自动清洁离子风机的主要功能

除静电离子风机有好几种类型&#xff0c;其功能、外观、材质尺寸都大不相同&#xff0c;下面介绍的是自清洁清洁型的离子风机。 离子风机具有自动清洁&#xff0c;免保养&#xff0c;除静电效果长期稳定的特点。其主要特征有&#xff1a;1.自动清洁&#xff1a;可根据环境在0-9…

华为云云耀云服务器L实例评测|StackEdit中文版在线Markdown笔记工具

华为云云耀云服务器L实例评测&#xff5c;StackEdit中文版在线Markdown笔记工具 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 应用场景1.3 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 StackEdit 中文版3.1 StackEdit 介绍3.2 环…

学习路之PHP--laravel postman 提交表单出现419错误

问题图片 解决&#xff1a; 白名单 有时候你可能希望设置一组不需要 CSRF 保护的 URL 。例如&#xff0c;如果你正在使用 Stripe 处理付款并使用了他们的 webhook 系统&#xff0c;你会需要从 CSRF 的保护中排除 Stripe webhook 处理程序路由&#xff0c;因为 Stripe 不知道要发…

最新版WPS 2023 加载Zotero方法

安装wps2019vba.exe&#xff0c;获取链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1eeoc6Tmwyzxh3n1MFQTVeA 提取码&#xff1a;6431 –来自百度网盘超级会员V8的分享 打开WPS的工具的加载项 添加文件路径&#xff0c;我的在&#xff1a; C:\Users\Administrat…

极盾故事|“二次授权”“脱敏复原”,某银行数据动态脱敏系统get新技能?

数据&#xff0c;既要可用&#xff0c;又要安全&#xff0c;还要合规&#xff01;企业“一难、两难、多难”的困境&#xff0c;如何破&#xff1f; 极盾科技助力某商业银行&#xff0c;基于极盾觅踪构建应用数据动态脱敏系统&#xff0c;实现30&#xff0b;核心应用系统以及用户…

无涯教程-JavaScript - ROUNDDOWN函数

描述 ROUNDOWN函数将数字向下舍入为零。 ROUNDDOWN是Excel舍入函数之一。 语法 ROUNDDOWN (number, num_digits)争论 Argument描述Required/OptionalNumberAny real number that you want rounded down.RequiredNum_digitsThe number of digits to which you want to round…

MySQL 几种导数据的方法与遇到的问题

零、说在前面 MySQL导数据通常使用第三方工具和MySQL自身的工具&#xff0c;本文分别就这两类方法分别介绍。 一、第三方工具之 Navicat 1.1、Navicat的“数据传输”工具 打开Navicat&#xff0c;点击“工具”标签&#xff0c;找到“数据传输”&#xff0c;即可看到操作界面。…

AI究竟能提升多少效率?哈佛已揭秘量化结果

在工作中使用AI可以带来工作效率的显着的改善。使用AI的被测试者比没有使用AI的被测试者平均多完成了 12.2% 的任务&#xff0c;完成任务的速度提高了 25.1%&#xff0c;并且产生的结果质量提高了 40%。大型语言模型&#xff08;LLM&#xff09;的公开发布引发了人们对人工智能…