给枚举值增加扩展数据
一般的每个枚举值对应着一个值, 而有时一个枚举值又具有其他的对应值或者需要有额外的扩展数据,这时我们怎么办?一种简单的方案是,可以定义一个以枚举值为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
}获取扩展数据的结果如下图
转载请注明出处

浙公网安备 33010602011771号