首页 / C#开发 / 正文

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

4265 发布于: 2017-04-19 读完约需9分钟

枚举是很多编程语言中的常用数据类型,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);
        }
    }
}

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: ASP.NET MVC5 Web应用程序使用同一个控制器渲染加载不同的视图文件实现的PC版和移动版

下一篇: 基于MemoryCache来实现的ASP.NET Web应用程序简单定时任务调度解决方案

本文永久链接码友网 » [C#/.NET]根据枚举值读取枚举对应的描述信息的静态泛型扩展方法

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册