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可以大大增强我们代码的可读性。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring依赖注入的魔法:深入DI的实现原理【beans 五】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Spring依赖注入的魔法&#xff1a;深入DI的实现原理【beans 五】 前言DI的基本概念基本概念&#xff1a;为什么使用依赖注入&#xff1a; 构造器注入构造器注入的基本概念&#xff1a;示例&#xff1a…

RK3568 学习笔记 : 解决 linux_sdk 编译 python 版本报错问题

前言 最近买了 【正点原子】 的 RK3568 开发板&#xff0c;下载了 开发板的资料&#xff0c;包括 Linux SDK&#xff0c;这个 Linux SDK 占用的空间比较大&#xff0c;扩展了一下 VM 虚拟机 ubuntu 20.04 的硬盘空间&#xff0c;编译才正常通过。 编译 RK3568 Linux SDK 时&am…

二维地图组件开发

很多的业务项目中&#xff0c;都会用到二维地图&#xff0c;二维地图功能简洁&#xff0c;并且很多在很多的业务中采用&#xff0c;维护难度也比三维地图小一些。而开发二维地图的开源库有QGis&#xff0c; Mapwingis等。 采用mapwingis开发了一个二维地图组件&#xff0c;可以…

Jmeter事务控制器聚合报告

Jmeter 事务控制器。 在Jmeter中&#xff0c;默认一个取样器就是一个事务 事务控制器控制其子集取样器&#xff0c;合并为一个事务 添加&#xff1a;逻辑控制器/Logic Controller -> 事务控制器/Transaction Controller TPS: 服务器每秒处理的事务数 在事务控制器下添加多…

Http与Tcp协议的原理以及应用

OSI七层模型和相关协议 七层模型从上到下如下所示&#xff1a; 应用层&#xff1a;负责应用之间的通信&#xff0c;处理请求和响应的具体格式表示层&#xff1a;对于数据格式进行处理会话层&#xff1a;负责建立和断开通信连接&#xff0c;传输层&#xff1a;负责建立端口之间…

gdal平面几何空间关系

关于平面几何的空间关系判定&#xff0c;gdal提供了8个函数&#xff0c;分别是&#xff1a;Intersects&#xff08;相交&#xff09;&#xff0c;Equals&#xff08;相等&#xff09;&#xff0c;Disjoint&#xff08;不相交&#xff09;&#xff0c;Touches&#xff08;接触&a…

LeetCode做题总结 15. 三数之和、18. 四数之和 (Java)

不会做&#xff0c;参考了代码随想录和力扣官方题解&#xff0c;对此题进行整理。 X数之和 15. 三数之和代码思路20240103重写错误1错误2Java语言点总结 18. 四数之和代码思路20240104&#xff08;伪&#xff09;错误1 第一次剪枝错误2 第二次剪枝错误3 溢出 15. 三数之和 代码…

C#使用纯OpenCvSharp部署yolov8-pose姿态识别

【源码地址】 github地址&#xff1a;https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-Pose算法是一种基于深度神经网络的目标检测算法&#xff0c;用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块&#xff0c;通过联合检测和姿势…

vue icon 本地正常 线上打包失败变乱码

出现这个原因是因为sass解析的问题 Node版本高的话可以通过升级sass版本 并且配置vue.config规避这个问题 //给sass配置的东西 这个对应的版本是sass 1.39.0 本人node版本v14 升级sass版本后出现报错css: {loaderOptions: {scss: {additionalData: import "/styles/var…

网络请求 - 异步编程详解

一、概述 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 HTTP和WebSocket都是啥&#xff1f; 比如我…

速记计算机网络传输介质分类

计算机网络中的传输介质是指用于在不同设备之间传递数据的物理媒介。传输介质的选择对于网络的性能和可靠性至关重要。在计算机网络中&#xff0c;常见的传输介质可以分为有线传输介质和无线传输介质两类。本文将对这两类传输介质进行详细的分类和介绍。 一、有线传输介质 有…

外包干了4个月,技术退步明显了...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四…

[C]jupyter中使用C

[C]jupyter中使用C 安装使用用处 安装 https://github.com/brendan-rius/jupyter-c-kernel 下拉找到3条命令&#xff0c;装就可以了 mac和linux可用 python3可用&#xff0c; 2不可以 第二条命令可以改为 : python3 install_c_kernel 小总结&#xff1a;如果有问题&#xff0…

Merge还是Rebase?这次终于懂了

《Git分支管理&#xff1a;Merge还是Rebase&#xff1f;》 导语&#xff1a; 在Git的分支管理中&#xff0c;Merge和Rebase是两种常见的合并策略&#xff0c;每一种都有其优劣之处。究竟应该选择Merge还是Rebase&#xff0c;取决于项目的需求和团队的工作流程。本文将深入探讨…

echarts 仪表盘进度条 相关配置

option {series: [{type: gauge,min: 0,//最大值max: 100, //最小值startAngle: 200,//仪表盘起始角度。圆心 正右手侧为0度&#xff0c;正上方为90度&#xff0c;正左手侧为180度。endAngle: -20,//仪表盘结束角度splitNumber: 100, //仪表盘刻度的分割段数itemStyle: {color…

WPF 使用矢量字体图标

矢量字体图标 在WPF项目中经常需要显示图标&#xff0c;但是项目改动后&#xff0c;有时候需要替换和修改图标&#xff0c;这样非常麻烦且消耗开发和美工的时间。为了快速开发项目&#xff0c;节省项目时间&#xff0c;使用图标矢量字体图标是一个非常不错的选择。 矢量字体图标…

【java爬虫】首页显示沪深300指数走势图以及前后端整合部署方法

添加首页 本文我们将在首页添加沪深300指数成立以来的整体走势数据展示&#xff0c;最后的效果是这样的 单独贴一张沪深300整体走势图 我感觉从总体上来看指数还是比较稳的&#xff0c;没有特别大的波动&#xff0c;当然&#xff0c;这只是相对而言哈哈。 首先是前端页面 &l…

C++性能优化- perf 和火焰图的安装使用

工欲善其事必先利其器&#xff0c;要想做Linux下的程序性能优化&#xff0c;就得先知道当前性能的瓶颈在哪里。 这里主要介绍一下常用的工具&#xff1a;perf工具和火焰图的使用方法 本文中的命令都是自己在Ubuntu18.04系统上测试可用的&#xff0c;在其他系统可能会需要不同的…

数据库的连接

连接数据库 我们使用WinR输入cmd打开运行窗口 输入:sqlplus并回车 输入用户名和密码,我用的是Scott,密码我自己设置的123456,Scott默认的密码是tiger,回车 这种情况表示登录成功 在连接Scott成功的情况下创建一些数据,在我的资源里面有个Oracle数据基础可以下载,直接复制粘…

HarmonyOS 开发基础(六)Slider

HarmonyOS 开发基础&#xff08;六&#xff09;Slider Entry Component struct Index {build() {Row() {Column() {// Slider&#xff1a;ArkUI 的基础组件 滑动条组件// options 参数&#xff1a;Slider 基础设置Slider({// 最小值min: 20,// 最大值max: 200,// 当前值value: …