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

news2024/7/7 15:10:09

文章目录

  • 前言
  • 简单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.coloradmin.cn/o/1359975.html

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

相关文章

【Unity】如何在Unity中使用C#的NuGet 包资源

【背景】 Unity的脚本语言是C#&#xff0c;而C#有很多功能和能力可以通过nuget包提供。有没有办法把这些能力结合到Unity中一起使用呢&#xff1f;如果可以&#xff0c;那将大大扩展Unity中各类功能实现的便捷性。 【方法】 答案是&#xff1a;你可以&#xff01; 获取Nuge…

【数据库原理】(8)关系数据库的关系代数

关系数据语言可以分为三类: 关系代数、关系演算和介于关系代数与关系演算之间的语言 SQL。 下面专门讲述用对关系进行运算来表达查询要求的关系代数。关系代数的运算对象是关系&#xff0c;运算结果也是关系。关系代数用到的运算符包括四类:集合运算符、专门的关系运算符、算术…

Mac上安装 Node.js 的版本管理工具 n,以及 n 使用,的使用

安装 最近刚更换 Mac 本进行项目的开发&#xff0c;刚上手 Mac 本还不是很熟练&#xff0c;需要安装 Node.js 的包管理工具 在 Windows 上我是实用的 nvm 来管理的 Node 版本&#xff0c;但是我尝试下载 Nvm &#xff0c;发现下载安装后的 Nvm 无法使用&#xff0c;提示 “Th…

关于苹果iOS 16:揭开伪装成飞机模式的隐形蜂窝接入漏洞的动态情报

一、基本内容 在日常生活中&#xff0c;网络威胁不断演变&#xff0c;给个人和组织带来了一系列重大挑战。网络犯罪分子使用的一种最常见的、最具破坏性的方法之一就是网络钓鱼。这种攻击方式通过电子邮件、短信或其他通讯渠道冒充可信实体&#xff0c;诱使个人泄露敏感信息&am…

AI到底是啥?

什么是AI? AI&#xff0c;即人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;是一门研究如何让机器模拟人类智能的学科。它涉及到构建可以感知、推理、学习和决策的智能系统&#xff0c;以解决复杂问题和实现人类类似的任务。 AI的技术包括机器学习、自…

Nginx 开启目录浏览功能

目录 1.没开启前的页面效果 2.开启目录浏览 1.没开启前的页面效果 这是我的一个网站页面&#xff0c;没配置目录浏览功能前的效果 2.开启目录浏览 来到 server 配置文件下 /etc/nginx/conf.d, 然后编辑配置文件&#xff0c;保存之后查看语法是否正确 autoindex on; # 开启目…

MySQL数据库的CURD、常见函数及UNION和UNION ALL

一、概述 MySQL是一种流行的关系型数据库管理系统&#xff0c;广泛应用于各种应用场景。在MySQL中&#xff0c;CURD操作是指创建&#xff08;Create&#xff09;、读取&#xff08;Read&#xff09;、更新&#xff08;Update&#xff09;和删除&#xff08;Delete&#xff09;…

TikTok需要的原生IP是什么?海外独享原生IP地址如何获取?

相信很多做跨境店铺或者TikTok直播的小伙伴都听说过”原生IP”,网络上关于它的判定方法也五花八门&#xff0c;今天小编以自身跨境经验来为大家介绍原生IP是什么?有什么好处&#xff1f;如何获取&#xff0c;感兴趣请继续看下去&#xff01; 一、什么是原生IP/非原生IP? 原生…

JAVA学习专栏

JAVA专栏 Java核心技术 Java核心技术 Java练手算法 Java练手算法 Java数据结构和算法 Java数据结构和算法 Java设计模式 Java设计模式 Java并发编程 Java并发编程 MySQL数据库 MySQL数据库 Java项目管理Maven Java项目管理Maven 项目管理工具gradle 项目管理工具gradle…

Python如何求解最长公共子序列

Python-求解两个字符串的最长公共子序列 一、问题描述 给定两个字符串&#xff0c;求解这两个字符串的最长公共子序列&#xff08;Longest Common Sequence&#xff09;。比如字符串1&#xff1a;BDCABA&#xff1b;字符串2&#xff1a;ABCBDAB。则这两个字符串的最长公共子序…

[电子榨菜]状态管理redux,以及react-redux

0.写在前面 很遗憾&#xff0c;最终还是没能入围2023年的博客评选。 不过不管怎么说&#xff0c;今年需要开个好头。 迫于成本压力吧&#xff0c;最终还是没能顺利离开这里。。。。。。 其实白天已经能放的下啦&#xff0c;我给自己买了喜欢的玩具&#xff0c;去了喜欢的漫…

Typescript 中的namespace

命名空间&#xff1a; 类似 vuex 的 namespace 相当于一个容器。 namespace 是一种将相关代码组织在一起的方式&#xff0c;中文译为“命名空间”。 它出现在 ES 模块诞生之前&#xff0c;作为 TypeScript 自己的模块格式而发明的。但是&#xff0c;自从有了 ES 模块&#x…

龙蜥操作系统上玩转铜锁密码库

编者按&#xff1a;龙蜥操作系统 Anolis OS 支持多计算架构&#xff0c;也面向云端场景优化&#xff0c;兼容 CentOS 软件生态&#xff0c;旨在为广大开发者和运维人员提供稳定、高性能、安全、可靠、开源的操作系统服务。本文为龙蜥社区理事单位蚂蚁集团技术专家张成龙&#x…

初识Winform

什么是winform&#xff1f; WinForms&#xff08;Windows Forms&#xff09;是Microsoft .NET框架中的一个用户界面&#xff08;UI&#xff09;技术&#xff0c;用于创建Windows应用程序。它提供了一组用于构建图形用户界面的类和控件&#xff0c;以及与用户交互的事件模型。 …

HackTheBox - Medium - Linux - Awkward

Awkward Awkward 是一款中等难度的机器&#xff0c;它突出显示了不会导致 RCE 的代码注入漏洞&#xff0c;而是 SSRF、LFI 和任意文件写入/追加漏洞。此外&#xff0c;该框还涉及通过不良的密码做法&#xff08;例如密码重用&#xff09;以及以纯文本形式存储密码来绕过身份验…

CEC2017(Python):七种算法(RFO、DBO、HHO、SSA、DE、GWO、OOA)求解CEC2017

一、7种算法简介 1、红狐优化算法RFO 2、蜣螂优化算法DBO 3、哈里斯鹰优化算法HHO 4、麻雀搜索算法SSA 5、差分进化算法DE 6、灰狼优化算法GWO 7、鱼鹰优化算法OOA 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., &…

聚观早报 |小米汽车SU7官图发布;优酷上线“AI搜片”功能

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 12月29日消息 小米汽车SU7官图发布 优酷上线“AI搜片”功能 小米汽车智能驾驶技术公布 百度投资AIGC公司必优科技…

安科瑞新能源汽车车充电桩有序充电——安科瑞 顾烊宇

要&#xff1a;随着当前经济的不断发展&#xff0c;国家的科技也有了飞速的进步&#xff0c;传统的燃油汽车已经不能适应当前社会的发展&#xff0c;不仅对能源造成巨大的消耗&#xff0c;还对环境造成了污染&#xff0c;当前一种新型的交通运输工具正在占领汽车市场。新能源汽…

OEE如何为制造企业实施ISO50001提供支持

ISO50001是一项旨在帮助企业建立和实施能源管理体系的国际标准&#xff0c;以提高能源效率、降低能源消耗和减少环境影响。而设备OEE&#xff08;设备综合效率&#xff09;作为一个关键的生产效率指标&#xff0c;可以为企业实施ISO50001提供重要的支持。本文将介绍ISO50001能源…

手机/平板实现电脑第三屏-记录极简

软件&#xff1a; 手机 平板 : moonlight 电脑&#xff1a; 1 KtzeAbyss/Easy-Virtual-Display 2 Parsec Virtual Display Driver https://builds.parsec.app/vdd/parsec-vdd-0.38.0.0.exe 3 LizardByte/Sunshine: Self-hosted game stream host for Moonlight. (gith…