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.mzph.cn/news/600047.shtml

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

相关文章

WPF美化ItemsControl1:不同颜色间隔

首先我们有的是一个绑定好数据的ItemsControl <ItemsControl ItemsSource"{Binding Starts}"> </ItemsControl> 运行后呢是朴素的将数据竖着排列 如果想要数据之间有间距&#xff0c;可以使用数据模板&#xff0c;将数据放到TextBlock中显示&#xff0…

Flutter PageView属性说明

属性说明scrollDirection滑动反向 Axis.vertical上下滑动 Axis.horizontal左右滑动reverse是否反转 true从最后一个记0controllerPageController见下文physics滚动方式pageSnapping是否有回弹效果onPageChanged监听切换children子组件dragStartBehavior处理拖拽开始行为方式 p…

深度学习(Pytorch版本)

零.前置说明 1、code 2、视频 数据预处理实现_哔哩哔哩_bilibili

回归模型代码实现

回归模型代码实现 1.多元函数线性回归w的求法 import numpy as np# 定义一组自变量&#xff0c;每条数据最后一列为b x np.array([[1,1,1,1],[1,2,3,1],[2,2,4,1],[2,3,5,1]])# 定义w&#xff0c;其中b的值为0.5 y np.dot(x,np.array([2,4,6,0.5])) x_x_1 np.linalg.inv(n…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于Real-ESRGAN的TPU超分模型部署

2023 CCF 大数据与计算智能大赛 《基于TPU平台实现超分辨率重建模型部署》 洋洋很棒 李鹏飞 算法工程师 中国-烟台 2155477673qq.com 团队简介 本人从事工业、互联网场景传统图像算法及深度学习算法开发、部署工作。其中端侧算法开发及部署工作5年时间。 摘要 本文是…

超维空间M1无人机使用说明书——31、基于模板匹配的物体识别功能

引言&#xff1a;ROS提供的物体识别功能包find_object_2d&#xff0c;该功能包用起来相对简单&#xff0c;只需要简单进行模板匹配即可。需要接显示器进行模板训练&#xff0c;远程比较卡&#xff0c;不建议 一、功能包find_object_2d简介 ROS的优点之一是有大量可以在应用程…

【React系列】Redux(一)管理状态

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 在React的开发过程中&#xff0c;Redux对于我们是非常重要的。 但是对于很多人来说&#xff0c;初次接触redux会感觉r…

基于SSM的人事档案管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Vue响应式中的渲染 watcher

在Vue响应式系统中&#xff0c;有一个重要的概念叫做渲染 watcher。渲染 watcher是Vue内部使用的一种特殊类型的watcher&#xff0c;它负责监听组件中使用的响应式数据&#xff0c;并在数据发生变化时重新渲染组件。 每个组件都有一个与之关联的渲染 watcher。当组件被创建时&…

1.大数据概述

目录 概述hadoophadoop 模块hadoop 发行版apache社区版本CDP(CDHHDP)其它云产商框架选择 hadoop 安装 结束 概述 先了解几个常用的网站 apache 官网hadoop 官网hadoop githubhttps://github.com/apache/xxx [https://github.com/apache/spark (example)] hadoop hadoop 模块…

ssm基于web的网络游戏交易平台信息管理系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装网络游戏交易平台软件来发挥其高效地信息处理的作用&#x…

基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码

基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于帝国主义竞争算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于帝国主义竞争优化的Elman网络5.测试结果6.参考文献7.Matl…

【Java 进阶篇】Nginx 使用详解:搭建高性能的 Web 服务器

在互联网的世界里&#xff0c;Web 服务器是我们访问网站、获取信息的入口。Nginx&#xff08;发音"engine x"&#xff09;作为一款轻量级、高性能的 Web 服务器和反向代理服务器&#xff0c;因其出色的性能和可扩展性而备受推崇。本文将围绕 Nginx 的使用进行详解&am…

数据结构学习 jz56数组中数字出现的次数

关键词&#xff1a;位运算 异或性质 虽然有两道题&#xff0c;但是其实应该分成三个级别的题目。 题目一&#xff1a; 一个整型数组 sockets 里除 一个 数字之外&#xff0c;其他数字都出现了两次。 思路&#xff1a;异或的性质 复杂度计算&#xff1a; 时间复杂度O(n) 空…

Python字符串

目录 1 创建字符串的三种方式2 字符串的转义3 字符串的格式化输出4 字符串的索引5 字符串的切片6 字符串的拼接7 计算字符串的长度8 判断字符串是否存在 字符串是编程中经常使用到的概念&#xff0c;熟悉字符串的常见用法是掌握编程的必经之路&#xff0c;本篇介绍一下字符串的…

ASP.NET Core高级之认证与授权(一)--JWT入门-颁发、验证令牌

阅读本文你的收获 了解认证和授权的作用了解在ASP.NET Core中实现身份认证的技术都有哪些学习基于JWT认证并学会颁发和验证JWT令牌 一、重要的前置概念 在一个系统中&#xff0c;不是所有的功能和资源都能够被自由地访问&#xff0c;比如你存在银行系统里面的资金&#xff0c…

Java数据结构---链表的基本用法(如创建等基本使用方法)

目录 一、单链表 &#xff08;1&#xff09;addFirst &#xff08;2&#xff09;addLast &#xff08;3&#xff09;遍历 &#xff08;4&#xff09;get &#xff08;5&#xff09;insert &#xff08;6&#xff09;removeFirst &#xff08;7&#xff09;remove 二、…

网络故障问题一般性检查排查思路

一、基本连通性检查 在网络中ping是一个十分强大的TCP/IP工具。它可以用来检测网络的连通情况和分析网络速度、也可以ping网址根据域名得到服务器IP、同时我们根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。 ping 网址&#xff0c;有几种输出情况&a…

Linkage Mapper 工具参数详解——Centrality Mapper

【小白一学就会无需其他教程】此文档用于解析使用Linkage Mapper 各输入输出参数详情以及可能的影响&#xff0c;并介绍了如何解释模型输出结果和输出参数&#xff0c;适合刚入手的人。篇幅很长很啰嗦&#xff0c;是因为每个参数都解释的万分细致。 从以下链接中获取内容&…

软件测试基础理论学习-常见软件开发模型

瀑布模型 背景 瀑布模型的概念最早在1970年由软件工程师Winston W. Royce在其论文《Managing the Development of Large Software Systems》中提出。Royce虽然没有明确提出“瀑布模型”这个术语&#xff0c;但他描述了一种线性的、阶段性的开发流程&#xff0c;各个阶段之间具…