[C#/.NET]根据枚举值读取枚举对应的描述信息的静态泛型扩展方法

C#开发 2017-04-19 99阅读 0评论 0收藏 收藏本文

枚举是很多编程语言中的常用数据类型,C#语言中的枚举类型也是如此。枚举在一定程度上可以使程序更加易读和维护。本文分享一个关于枚举的静态扩展方法--根据枚举值读取枚举对应的描述信息的静态泛型扩展方法。 首先,创建一个枚举,如:

 public enum Status
    {
        /// <summary>
        /// 已下单
        /// </summary>
        [Description("已下单")]
        Ordered = 0,
        /// <summary>
        /// 已支付
        /// </summary>
        [Description("已支付")]
        Payed = 1,
        /// <summary>
        /// 配送中
        /// </summary>
        [Description("配送中")]
        Shipping = 2
    }

在上面的枚举中,为每个枚举项添加了Description的属性

注:Description属性在System.ComponentModel,所以请引入命名空间

using System.ComponentModel;

接着,定义一个静态类以及一个泛型的静态扩展方法,如:

public static class EnumExtensions
    {
        public static string GetDescription<T>(this T enumerationValue) where T : struct
        {
            var type = enumerationValue.GetType();
            if (!type.IsEnum)
            {
                throw new ArgumentException("泛型参数必须为枚举类型");
            }
            var memberInfo = type.GetMember(enumerationValue.ToString());
            if (memberInfo.Length <= 0) return enumerationValue.ToString();
            var attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
            return attrs.Length > 0 ? ((DescriptionAttribute)attrs[0]).Description : enumerationValue.ToString();
        }

        public static void Run()
        {
            var description = Status.Ordered.GetDescription();
            Console.WriteLine(description);
        }
    }

最后,我们就可以愉快地使用静态类EnumExtensions中的静态扩展方法GetDescription<T>来获取任意枚举类型的对应描述信息了。调用方法如下:

public static void Run()
{
    var description = Status.Ordered.GetDescription();
    Console.WriteLine(description);
    //输出:已下单
}

本示例完整代码:

using System;
using System.ComponentModel;

namespace PayOnline.UI.Util
{
    public enum Status
    {
        /// <summary>
        /// 已下单
        /// </summary>
        [Description("已下单")]
        Ordered = 0,
        /// <summary>
        /// 已支付
        /// </summary>
        [Description("已支付")]
        Payed = 1,
        /// <summary>
        /// 配送中
        /// </summary>
        [Description("配送中")]
        Shipping = 2
    }
    public static class EnumExtensions
    {
        public static string GetDescription<T>(this T enumerationValue) where T : struct
        {
            var type = enumerationValue.GetType();
            if (!type.IsEnum)
            {
                throw new ArgumentException("泛型参数必须为枚举类型");
            }
            var memberInfo = type.GetMember(enumerationValue.ToString());
            if (memberInfo.Length <= 0) return enumerationValue.ToString();
            var attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
            return attrs.Length > 0 ? ((DescriptionAttribute)attrs[0]).Description : enumerationValue.ToString();
        }

        public static void Run()
        {
            var description = Status.Ordered.GetDescription();
            Console.WriteLine(description);
        }
    }
}

转载请注明:图享网 » [C#/.NET]根据枚举值读取枚举对应的描述信息的静态泛型扩展方法

文章评论

获取验证码