C# Attribute特性实战(1):Swtich判断优化

文章目录

  • 前言
  • 简单Switch问题
    • 无参Swtich方法
      • 声明Swtich Attribute
      • 声明带有Swtich特性方法
      • 主方法
      • 结果
    • 有参Switch
      • 修改代码
      • 修改运行过程
      • 运行结果
  • 总结

前言

在经过前面两章内容的讲解,我们已经简单了解了如何使用特性和反射。我们这里解决一个简单的案例

C#高级语法 Attribute特性详解和类型,方法,变量附加特性讲解

C# 反射的终点:Type,MethodInfo,PropertyInfo,ParameterInfo,Summry

简单Switch问题

我们经常会遇到Switch的代码过于冗长的问题,就算使用Enum枚举类型,也无法优化Switch代码。如果Switch类型继续增长,我们的swtich代码就会跟着变长

在这里插入图片描述

无参Swtich方法

声明Swtich Attribute

namespace NetCore.MyAttributes
{[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]public class MySwitchAttribute:Attribute{public enum SwichFlags { Apple, Banana, Pear, Ball }public SwichFlags Flag { get; set; }public MySwitchAttribute(SwichFlags swichFlags){Flag = swichFlags;}public MySwitchAttribute() { }}
}

声明带有Swtich特性方法

这里用到了这个文章封装好的静态方法

C#高级语法 Attribute特性详解和类型,方法,变量附加特性讲解


namespace NetCore.Services
{public class SwitchService{public SwitchService() {}/// <summary>/// 用于解决Switch过长的问题/// </summary>/// <param name="flags"></param>public void SwitchLoop(MySwitchAttribute.SwichFlags flags){//此方法为自定义的方法var methods = MyAttributeHelper.GetAll_MethodAndAtt<MySwitchAttribute>(typeof(SwitchService));var method = methods.Find(t =>{return t.att.Flag == flags;});//找到那个目标的Switch方法if(method.method == null){Console.WriteLine($"找不到该方法{flags.ToString()}");}else{method.method.Invoke(this,null);}}/// <summary>/// 注意,能用找到的方法必然是public/// </summary>[MySwitch(MySwitchAttribute.SwichFlags.Apple)]public void SwitchApple(){Console.WriteLine("苹果");}[MySwitch(MySwitchAttribute.SwichFlags.Banana)]public void SwitchBanana(){Console.WriteLine("香蕉");}[MySwitch(MySwitchAttribute.SwichFlags.Pear)]public void SwitchPear(){Console.WriteLine("梨");}}
}

主方法

static void Main(string[] args)
{var serivce = new SwitchService();//Apple修饰的方法是有的serivce.SwitchLoop(MySwitchAttribute.SwichFlags.Apple);//Ball修饰的方法是没有的serivce.SwitchLoop(MySwitchAttribute.SwichFlags.Ball);//var methods = MyAttributeHelper.GetAllMethods<MySwitchAttribute>(typeof(SwitchService));Console.WriteLine("运行完成!");Console.ReadKey();
}

结果

在这里插入图片描述

有参Switch

有参Switch,或者说能通过某种方法把参数传进去。个人不建议使用方法的方式入参,使用本身属性的方法入参更好。

修改代码

  public class SwitchService{public string Name { get; set; }    public SwitchService() {}/// <summary>/// 用于解决Switch过长的问题/// </summary>/// <param name="flags"></param>public void SwitchLoop(MySwitchAttribute.SwichFlags flags){var methods = MyAttributeHelper.GetAll_MethodAndAtt<MySwitchAttribute>(typeof(SwitchService));//此方法为自定义的方法var method = methods.Find(t =>{return t.att.Flag == flags;});//找到那个目标的Switch方法if(method.method == null){Console.WriteLine($"找不到该方法{flags.ToString()}");}else{method.method.Invoke(this,null);}}/// <summary>/// 注意,能用找到的方法必然是public/// </summary>[MySwitch(MySwitchAttribute.SwichFlags.Apple)]public void SwitchApple(){Console.WriteLine($"Name:{Name}");Console.WriteLine("苹果");}[MySwitch(MySwitchAttribute.SwichFlags.Banana)]public void SwitchBanana(){Console.WriteLine($"Name:{Name}");Console.WriteLine("香蕉");}[MySwitch(MySwitchAttribute.SwichFlags.Pear)]public void SwitchPear(){Console.WriteLine($"Name:{Name}");Console.WriteLine("梨");}}

修改运行过程

    static void Main(string[] args){var serivce = new SwitchService();//Apple修饰的方法是有的,尝试使用属性的方式入参serivce.Name = "小王";serivce.SwitchLoop(MySwitchAttribute.SwichFlags.Apple);//Ball修饰的方法是没有的serivce.Name = "小红";serivce.SwitchLoop(MySwitchAttribute.SwichFlags.Ball);//var methods = MyAttributeHelper.GetAllMethods<MySwitchAttribute>(typeof(SwitchService));Console.WriteLine("运行完成!");Console.ReadKey();}

运行结果

在这里插入图片描述

总结

我们这里讲解了一下简单的Switch简化,我们平常遇到的长Switch可能有2,30个以上的条件判断。使用Attribute可以大大增强我们代码的可读性。

入参问题个人还是建议使用方法获取本身属性,函数入参写起来会过于麻烦。

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

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

相关文章

摄像头视频录制程序使用教程(Win10)

摄像头视频录制程序-Win10 &#x1f957;介绍&#x1f35b;使用说明&#x1f6a9;config.json 说明&#x1f6a9;启动&#x1f6a9;关闭&#x1f6a9;什么时候开始录制&#xff1f;&#x1f6a9;什么时候触发录制&#xff1f;&#x1f6a9;调参 &#x1f957;介绍 检测画面变化…

前端Web系统架构设计

文章目录 1.目录结构定义2. 路由封装2.1 API路由定义2.2 组件路由定义 3. Axios请求开发4. 环境变量封装5. storage模块封装(sessionStorage, localStorage)6. 公共函数封装(日期,金额,权限..)7. 通用交互定义(删除二次确认,类别,面包屑...)8. 接口全貌概览 1.目录结构定义 2. …

30、共空间模式CSP与白化矩阵

CSP算法和PCA降维都涉及到了白化&#xff0c;那白化的目的和作用到底是啥呢&#xff1f; 矩阵白化目的&#xff1a; 对于任意一个矩阵X&#xff0c;对其求协方差&#xff0c;得到的协方差矩阵cov(X)并不一定是一个单位阵。 下面介绍几个线代矩阵的几个概念&#xff1a; 1、…

计算机网络——OSI参考模型

1. OSI模型的基本概念 1.1 定义 OSI&#xff08;开放式系统互联&#xff09;模型是一个用于理解和标准化电信系统或计算机网络功能的概念性的框架&#xff0c;用于描述和标准化不同计算机系统或网络设备间通信的功能。 1.2 OSI模型的性质 这个模型由国际标准化组织&#xff08…

CMake入门教程【核心篇】定义C++宏定义(add_compile_definitions)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.基本用法2.定义单个宏3.定义多个宏4.条件定义宏5.使用预定义变量6.使用 generator 表达式

7款实用的SQLite数据库可视化管理工具

前言 俗话说得好“工欲善其事&#xff0c;必先利其器”&#xff0c;合理的选择和使用可视化的管理工具可以降低技术入门和使用门槛。今天推荐7款实用的SQLite数据库可视化管理工具(GUI)&#xff0c;帮助大家更好的管理SQLite数据库。 什么是SQLite&#xff1f; SQLite是一个…

每日一题——LeetCode1089.复写0

方法一 splice&#xff1a; 通过数组的slice方法&#xff0c;碰到 0就在后面加一个0&#xff0c;最后截取原数组的长度&#xff0c;舍弃后面部分。 但这样做是违反了题目的要求&#xff0c;不要在超过该数组长度的位置写入元素。 var duplicateZeros function(arr) {var le…

超简单的详细教程:如何为一个GitHub开源项目做出贡献!

仓库&#xff1a;Ai-trainee/GPT-Prompts-Hub 让我们通过一个具体的例子&#xff0c;详细了解如何从克隆一个GitHub仓库开始&#xff0c;一步步地贡献到一个项目。以下是详细步骤&#xff0c;包括所需的代码和说明&#xff1a; 首先我们Fork想要贡献的项目&#xff0c;然后请看…

网络安全红队常用的攻击方法及路径

一、信息收集 收集的内容包括目标系统的组织架构、IT资产、敏感信息泄露、供应商信息等各个方面&#xff0c;通过对收集的信息进行梳理&#xff0c;定位到安全薄弱点&#xff0c;从而实施下一步的攻击行为。 域名收集 1.备案查询 天眼查爱企查官方ICP备案查询 通过以上三个…

MySQL进阶篇(一)存储引擎

一、MySQL 体系结构 &#xff08;1&#xff09; 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于 连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xf…

TSConfig 配置(tsconfig.json)

详细总结一下TSConfig 的相关配置项。个人笔记&#xff0c;仅供参考&#xff0c;欢迎批评指正&#xff01; 另外&#xff0c;如果想了解更多ts相关知识&#xff0c;可以参考我的其他笔记&#xff1a; vue3ts开发干货笔记ts相关笔记&#xff08;基础必看&#xff09;ts相关笔记…

【十六】【动态规划】97. 交错字符串、712. 两个字符串的最小ASCII删除和、718. 最长重复子数组,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…