给枚举值增加扩展数据
一般的每个枚举值对应着一个值, 而有时一个枚举值又具有其他的对应值或者需要有额外的扩展数据,这时我们怎么办?一种简单的方案是,可以定义一个以枚举值为KEY的字典,然后在Value中填入相应的值。当这个对应的值是固化的,那是不是一定要字典存储呢?是否可以在定义枚举的时候就进行定义呢?答案是有的。
.Net中有一种特别的类Attribute,继承自Attribute的类可以在枚举上直接添加相应的数据,比如常见的Description就是继承自Attribute,我们在定义枚举的时候,如果需要枚举对应相应的文字描述,可以这样定义。
public enum SwitchEnum { [Description("打开")] Open, [Description("关闭")] Close }那我们要如何得到Description呢?可以通过反射。为了方便调用,我们写了一个针对枚举的扩展方法。
public static class EnumExtension{//扩展方法必须写到静态类中 /// <summary> /// 获取枚举值的描述文本 /// </summary> /// <param name="value"></param> /// <returns></returns> public static string FetchDescription(this Enum value) { FieldInfo fi = value.GetType().GetField(value.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes( typeof(DescriptionAttribute), false); return (attributes.Length > 0) ? attributes[0].Description : value.ToString(); } }
有了获取描述的扩展方法后,当我们拿到枚举值时,比如SwitchEnujm.Open.FetchDescription()就可以得到描述的值【打开】。
基于该原理,那么如果我们自己 定义一个继承自Attribute的类,然后写一个对应的扩展方法,那是不是就可以了?是的。代码如下
/// <summary> /// 枚举扩展数据特性 /// </summary> public class EnumExtensionDataAttribute : Attribute { public object ExtensionData { get; set; } public EnumExtensionDataAttribute() { } public EnumExtensionDataAttribute(object extensionData) { ExtensionData = extensionData; } }相应的扩展方法为
public static class EnumExtension { #region FetchExtensionData /// <summary> /// 获取枚举值的扩展数据 /// </summary> /// <param name="value"></param> /// <returns></returns> public static object FetchExtensionData(this Enum value) { FieldInfo fi = value.GetType().GetField(value.ToString()); var attributes = (EnumExtensionDataAttribute[])fi.GetCustomAttributes( typeof(EnumExtensionDataAttribute), false); return (attributes.Length > 0) ? attributes[0].ExtensionData : null; } #endregion }枚举值增加扩展数据
public enum SwitchEnum { [EnumExtensionData("08:01-18:00")] [Description("打开")] Open, [EnumExtensionData("18:01-08:00")] [Description("关闭")] Close }获取扩展数据的结果如下图
转载请注明出处