C#之枚举

枚举

  • 枚举类型 是由基础整型,数值类型的一组命名常量定义的值类型
  • 若要定义枚举类型,请使用 enum 关键字并指定枚举成员 的名称。
  • System.Enum 类型是所有枚举类型的抽象基类。
  • 枚举类型可以 与 int类型相互转换。

下面通过代码来学习一下:

定义一个枚举

public enum Status
{
    Hide =0,
    Show =1
}

枚举默认是int类型,不过我们可以通过继承来修改:

public enum Status:short
{
  Hide=0,
  Show=1
}

枚举类型与数值类型的转换

Console.WriteLine((short)Status.Hide);
Console.WriteLine((Status)0);

字符串转换成枚举

//如果无法转换,会抛异常
Status t = (Status)Enum.Parse(typeof(Status), "Hide");
Console.WriteLine(t);
Console.WriteLine(t.GetType());

枚举类型判断、遍历

var a = (Status)1;
if (a==Status.Show)
{
    Console.WriteLine("ok");
}

//判断枚举值是否在其中
short b = 1;
Console.WriteLine(Enum.IsDefined(typeof(Status), b));
Console.WriteLine(Enum.IsDefined(typeof(Status), "Show"));

//遍历枚举
foreach (var s in Enum.GetValues(typeof(Status)))
{
    Console.WriteLine(s);
}

给枚举加扩展方法

方法抄这位老哥的
通过利用扩展方法, 可以给枚举加中文描述,或者用描述反推会类型,给这个老哥点赞。

using System;
using System.ComponentModel;
using System.Linq;
using System.Reflection;

namespace ExtensionMethods
{
    public enum Status
    {
        [Description("隐藏")]
        Hide = 0,
        [Description("显示")]
        Show = 1
    }

    public static class MyExtensions
    {
        /// <summary>
        /// 扩展方法,获得枚举的Description
        /// </summary>
        /// <param name="nameInstead">如果枚举值没有定义Description,是否使用枚举的名称代替 
        /// </param>
        /// <returns>枚举的Description</returns>
        public static string GetDescription(this Enum value, bool nameInstead = true)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (string.IsNullOrEmpty(name))
            {
                return null;
            }

            FieldInfo field = type.GetField(name);
            var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;

            if (attribute == null && nameInstead)
            {
                return name;
            }
            return attribute?.Description;
        }


        /// <summary>
        /// 根据Description获取枚举值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value"></param>
        /// <returns></returns>
        public static T GetValueByDescription<T>(this string description) where T : struct
        {
            Type type = typeof(T);
            foreach (var field in type.GetFields())
            {
                if (field.Name == description)
                {
                    return (T)field.GetValue(null);
                }

                var attributes = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), true);
                if (attributes != null && attributes.FirstOrDefault() != null)
                {
                    if (attributes.First().Description == description)
                    {
                        return (T)field.GetValue(null);
                    }
                }
            }

            throw new ArgumentException(string.Format("{0} 未能找到对应的枚举.", description), "Description");
        }
    }
}

使用

using System;
using ExtensionMethods;

namespace ConsoleApp2
{
    class Program
    {
        /// <summary>
        /// 程序主入口。
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Console.WriteLine(Status.Hide.GetDescription());
            Status s="显示".GetValueByDescription<Status>();
            Console.WriteLine(s==Status.Show);
        }
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值