C# 枚举高级用法之Description

c# 枚举高级用法之

基础枚举

namespace TestEnum
{
    //声明
    public enum Name
    {
    //默认值 boob = 0 ,依次往下排,可自定义 jackMa = 3,jackCHan那就= 4
        boob,
        JackMa,
        JackChan,
        //
        Lisa,
        Poro
    }
}

声明枚举,调用。
几个常用的转换不做介绍,一嗦一大堆。

  1. enum转string
  2. enum 转int
  3. string转enum
  4. 整型转enum

高级点用法,反射元数据

    public enum Name
    {
        [Description("鲍勃")]
        boob,
        [Description("马宇")]
        JackMa,
        [Description("陈龙")]
        JackChan,
        [Description("丽莎")]
        Lisa,
        [Description("保罗")]
        Poro
    }

加了Description,就可以通过反射来访问这些数据
如何访问?

using System;
using System.ComponentModel;
namespace TestEnum
{
    //基础枚举
    public enum Name
    {
        [Description("鲍勃")]
        boob,
        [Description("马宇")]
        JackMa,
        [Description("陈龙")]
        JackChan,
        [Description("丽莎")]
        Lisa,
        [Description("保罗")]
        Poro
    }
    //主要这个GetDescription()方法,看不懂没关系,如何调用
    static class EnumExtensions
    {
        public static string GetDescription(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
            return customAttribute == null ? val.ToString() : ((DescriptionAttribute)customAttribute).Description;
        }
    }
}

调用

string str =  Name.boob.GetDescription();
//需要调用的地方调用

一个特性不够,能再加一个吗?
可以
加一个继承自Attribute 的类

    public class DataTest : Attribute
    {
        public string Data { get; set; }
        public DataTest(string data)
        {
            Data = data;
        }
        public DataTest(){}
    }

加完了自定义特性后你就会发现可以加了。。

   [Description("鲍勃")]
        [DataTest("中文3级")]
        boob,
        [Description("马宇")]
        [DataTest("中文2级")]
        JackMa,
        [Description("陈龙")]
        [DataTest("中文1级")]
        JackChan,
        [Description("丽莎")]
        [DataTest("中文2级")]
        Lisa,
        [Description("保罗")]
        [DataTest("中文2级")]
        Poro

就变成了这样
访问也得加一个

        public static string GetData(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DataTest));
            return customAttribute == null ? val.ToString() : ((DataTest)customAttribute).Data;
        }

调用

        string str = Name.boob.GetDescription();
        string DStr = Name.boob.GetData();

以上就是enum 加+自定义特性
不够可以随时自己加。
可以测试玩玩,据说反射浪费资源。

完整代码

using System;
using System.ComponentModel;
namespace TestEnum
{
    //基础枚举
    public enum Name
    {
        [Description("鲍勃")]
        [DataTest("中文3级")]
        boob,
        [Description("马宇")]
        [DataTest("中文2级")]
        JackMa,
        [Description("陈龙")]
        [DataTest("中文1级")]
        JackChan,
        [Description("丽莎")]
        [DataTest("中文2级")]
        Lisa,
        [Description("保罗")]
        [DataTest("中文2级")]
        Poro
    }
    public class DataTest : Attribute
    {
        public string Data { get; set; }
        public DataTest(string data)
        {
            Data = data;
        }
        public DataTest(){}
    }

    static class EnumExtensions
    {
        public static string GetDescription(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
            return customAttribute == null ? val.ToString() : ((DescriptionAttribute)customAttribute).Description;
        }
        public static string GetData(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DataTest));
            return customAttribute == null ? val.ToString() : ((DataTest)customAttribute).Data;
        }
    }
}


PS:可以声明obect类型Attribute.子类。 那。。。。。可发挥空间就大了。

————————————————
版权声明:本文为优快云博主「黄小月的爹地」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/huzi4152/article/details/110927862

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值