[小技巧]C#中如何为枚举类型添加描述方法

背景

在我们的日常开发中,我们会经常使用枚举类型。有时我们只需要显示枚举的值或者枚举值对应名称, 但是在某些场景下,我们可能需要将枚举值显示为不同的字符串。

例: 当前我们有如下枚举Level

    public enum Level
    {
        //Bad
        B = -1,

        //Normal
        N = 0,

        //Good
        G = 1,

        //Very Good
        VG = 2
    }

这个枚举有4个可选值B, N, G, VG。 现在我们希望用Bad, Normal, Good, Very Good作为B, N, G, VG的显示值。

那我们会怎么做呢?通常我们最常想到的就是针对Level枚举类型编写一个扩展方法。

    public static class LevelEnumExtension
    {
        public static string ToDescription(this Level level)
        {
            switch (level)
            {
                case Level.B:
                    return "Bad";
                case Level.G:
                    return "Good";
                case Level.N:
                    return "Normal";
                case Level.VG:
                    return "Very Good";
                default:
                    return "Normal";
            }
        }
    }

以上的代码在我们的项目中很常用。但是这里有2个潜在的问题:

  • 我们的项目中可能不止一种枚举类型,所以我们可能就需要为每一种类型都添加一个对应的扩展方法。
  • 枚举值和枚举的显示值的代码位置是分离的,如果你查找枚举值对应的显示值,你就要先去找到对应的枚举扩展方法。

那么如何改进这部分代码,从而消除上述2个问题呢,这时候我们就要引入.NET中的文本描述属性类DescriptionAttribute

使用DescriptionAttribute重构代码

其实.NET中已经提供了一个文本描述属性类DescriptionAttribute, 这个属性类的构造函数可以接收一段文字描述。

下面我们使用DescriptionAttribute来改造Level枚举类型。

    public enum Level
    {
        //Bad
        [Description("Bad")]
        B = -1,

        //Normal
        [Description("Normal")]
        N = 0,

        //Good
        [Description("Good")]
        G = 1,

        //Very Good
        [Description("Very Good")]
        VG = 2
    }

这样我们上面提到的第二个问题就解决了,现在Level枚举类型的枚举值和显示值就都封装在了一起。

那么第一个问题该怎么解决呢?

这里我们可以针对Enum类型添加扩展方法,并使用反射读取当前枚举值所对应的显示值

    public static class EnumExtension
    {
        public static string ToDescription(this Enum val)
        {
            var type = val.GetType();

            var memberInfo = type.GetMember(val.ToString());

            var attributes = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attributes == null || attributes.Length != 1)
            {
                //如果没有定义描述,就把当前枚举值的对应名称返回
                return val.ToString();
            }

            return (attributes.Single() as DescriptionAttribute).Description;
        }
    }

由于Enum类型是所有枚举类型的基类型,所以所有的枚举类型都可以使用这个扩展方法。

总结

本篇博文中,我们讲解了如果如何.NET内置的文本描述属性类DescriptionAttribute来生成枚举值对应的文本,它不仅可以减少重复代码,还可以让整个枚举类型的内聚性更高。

原文地址:https://www.cnblogs.com/lwqlun/p/10380992.html

时间: 2024-10-12 13:39:26

[小技巧]C#中如何为枚举类型添加描述方法的相关文章

[小技巧] bash 中快速跳转到目录里

该技巧仅仅适用于如下情况: $ ls /tmp $ cp a.txt /tmp 上述的命令里的最后一个参数是需要跳转的目录时, 按 Alt + . 键,即可快速输出对应的目录. 例子: $ ls /tmp $ cd -> 然后按 Alt + . 这时, /tmp会被自动补全. [小技巧] bash 中快速跳转到目录里

小技巧 - CSS中:hover调试

在调试CSS的时候,我一般使用Chrome的F12开发者工具,或者FireFox的FireBug直接在元素上面修改好Style后,再写入到CSS中.前几天遇到一个问题就是a:hover,鼠标一移开效果就看不到了.后来查了一些资料,终于找到解决办法了. FF中: Chrome中: 没有什么技术含量,只是分享一下,也免得自己忘记了.

iOS开发小技巧--TableView中headerView的循环利用,以及自定义的headerView

一.首先要搞清楚,tableView中有两种headerView,一个是tableHeaderView,另一个是headerView.前者就一个;后者根据session决定个数 headerView的循环利用跟cell的循环利用差不多,同样也可以注册,代码如下: 二.百思项目中,headerView只显示文字,但是只搞一个Label没法调整文字左边的间距.所以考虑包装一层view.进行了自定义headerView的封装,重写了headerView的 - (instancetype)initWit

#WordPress小技巧#纯代码为自己博客添加支付宝/微信打赏功能

原文:https://www.wn789.com/13323.html 很多人的WordPress博客在文章尾部都有打赏功能,让读者可以直接通过扫描微信.支付宝二维码进行赞助,毕竟维护博客,编写博文需要花费不少的精力,大多数朋友和蜗牛一样都是利用自己业余时间对博客进行管理与维护(如果大家觉得蜗牛789文章能起到一定帮助作用,也欢迎对蜗牛进行打赏,目前大家可以通过支付宝扫红包活动对蜗牛进行打赏,无需自己掏腰包#每日#支付宝扫码最高领取99元红包 可用于店面消费或捐赠蜗牛). 在此文章中蜗牛为大家分

从命令行同时移动多个文件类型的小技巧

我们知道,将某个类型的多个文件从一个目录移动到另一个目录很简单,但同时移动多种类型的多个文件或许会很麻烦,这里介绍一些让你在 Linux 中移动多种文件类型的小技巧. 同时移动多种文件类型 方法1: 假设 dir1 的目录中有多种类型的文件,如 .pdf .doc .mp3 .mp4 .txt 等,我们先来查看 dir1 中的内容: $ ls dir1 file.txt image.jpg mydoc.doc personal.pdf song.mp3 video.mp4 这时,你希望将某些文件

深入Java 1.5枚举类型的内部实现原理

Java是一种面向对象的高级编程语言.它的出众之处就在于它的简洁.一个程序员所要做的就是创建类(Create Class)以及定义接口(Define Interface),如此而已.当然,这种简洁和优美是有代价的,比如失去了Enum这种广泛使用的数据类型就是一个不小的损失.在Java 1.5以前,程序员们不得不通过一些变通的方法来间接的解决这一问题.比如说,被普遍使用的整数枚举替代法和类型安全类替代法(Type safe Enum).在正式讨论Java 1.5的枚举类型之前,让我们先简单回顾一下

Effective Java 第三版——34. 使用枚举类型替代整型常量

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. Java支持两种引用类型的特殊用途的系列:一种称为枚举类型的类和一种称为注解类型的接口. 本章讨论使用这些类型系列的最佳实践. 34. 使用枚举类型替代整型常量 枚举是其合

获取枚举类型Description特性的描述信息

C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExtensions { public static string GetDescription(this object value) { if (value==null) return string.Empty; Type type = value.GetType(); var fieldInfo = ty

Lync 小技巧-57-为Cisco UC下载YouTube视频(怕忘记,做笔记)

有偿提供培训.项目规划.实施.运维.排错: / <Skype for Business 2015 项目实战> / <跟菜鸟学Cisco UC部署实战> / <大企业云桌面部署实战> 咨询QQ: 3313395633 <跟菜鸟学Cisco UC部署实战>-上线了(线下培训班开班,见百度云) http://dynamic.blog.51cto.com/711418/1834588 问题: 1. 你找资料上YouTube看到有用的视频? 2. 想下载? 3. 要如