怎样让enum枚举支持string

原文发布时间为:2011-03-02 —— 来源于本人的百度文章 [由搬家工具导入]

大家都知道enum是以下两种情况,不能支持string

1,enum类型是静态
2,enum类型仅限于long、int、short   和byte。

,有的时候我们需要为枚举成员指定相应的说明性文字,如我引用SimpleEnum.Today的时候,需要在我的主界面上打印“今天”,而不是“Today”。这样就使我们在编码的时候要不停的编写switch来表示枚举变量的注释。那么,有没有更好的办法来维护我们的枚举成员呢。本文将提供一种解决方法。

例如,有如下枚举变量:

public enum SimpleEnum
    {
        Today,       //表示今天
        Tomorrow, //表示明天
    }

我们可以通过为枚举成员指定属性,达到一劳永逸。

首先我们需要创建一个EnumDescriptionAttribute类,表示对属性成员可以指定描述。

/// <summary>
    /// Provides a description for an enumerated type.
    /// </summary>
    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
    public sealed class EnumDescriptionAttribute : Attribute
    {
        private string description;
        public string Description
        {
            get { return this.description; }
        }

        /// <summary>
        /// Initializes a new instance of the class.
        /// </summary>
        /// <param name="description"></param>
        public EnumDescriptionAttribute(string description)
            : base()
        {
            this.description = description;
        }
    }

其次,我们需要创建一个EnumHelper类,用于获得属性的值。

public static class EnumHelper
    {
        /// <summary>
        /// Gets the <see cref="DescriptionAttribute" /> of an <see cref="Enum" />
        /// type value.
        /// </summary>
        /// <param name="value">The <see cref="Enum" /> type value.</param>
        /// <returns>A string containing the text of the
        /// <see cref="DescriptionAttribute"/>.</returns>
        public static string GetDescription(Enum value)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            string description = value.ToString();
            FieldInfo fieldInfo = value.GetType().GetField(description);
            EnumDescriptionAttribute[] attributes =
               (EnumDescriptionAttribute[])
             fieldInfo.GetCustomAttributes(typeof(EnumDescriptionAttribute), false);

            if (attributes != null && attributes.Length > 0)
            {
                description = attributes[0].Description;
            }
            return description;
        }
    }

最后,我们将上文介绍的枚举添加属性,如下:

public enum SimpleEnum
    {
        [EnumDescription("表示今天")]
        Today,       //
        [EnumDescription("表示明天")]
        Tomorrow, //
    }

这个时候,你就可以在任何想要得到这个属性描述的地方,使用如下语句:

Debug.Print("{0}", EnumHelper.GetDescription(SimpleEnum.Today));

不过我没有验证过这样使用的效率问题,以及会不会带来其它的问题,有兴趣的朋友可以研究一下

原文地址:https://www.cnblogs.com/handboy/p/7164004.html