众所周知,我们在使用枚举时,可以很轻松的获取枚举的名称和值:
public enum EnumOrderStatus
{
待制作 = 1,
制作中 = 2,
待发货 = 3,
待收货确认 = 4,
确认收货 = 5,
交易完成 = 6,
交易关闭 = 0
}
var needProduce = EnumOrderStatus.待制作;
var name = needProduce.ToString(); //获取枚举的名称:name = "待制作"
var value = (int)needProduce;//获取枚举的值:value = 1;枚举的常用方法如上。
在某项目中遇到业务场景如下:订单表中用一个OrderStatus记录了订单状态的枚举名称,需要在页面中呈现如下的订单进度,这下int类型的枚举值就不适用了,因为进度中的百分比中存在小数位。

这时可使用Attribute特性类扩展枚举,具体用法如下:
1. 创建一个特性类,继承System.Attribute
/// <summary>
/// 订单进度百分比数值
/// </summary>
[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]
public class Progress : System.Attribute
{
//进度值
public float ProgressValue { get; set; }
public Progress(float progress)
{
ProgressValue = progress;
}
}2. 在创建枚举的地方,为每个枚举值附上特性值
public enum EnumOrderStatus
{
[Progress(25f)]
待制作 = 1,
[Progress(25f * 2)]
制作中 = 2,
[Progress(25f * 3)]
待发货 = 3,
[Progress(25f * 3 + 12.5f)]
待收货确认 = 4,
[Progress(100f)]
确认收货 = 5,
[Progress(100f)]
交易完成 = 6,
[Progress(100f)]
交易关闭 = 0
}3. 创建特性类取值方法,此处为了调用方便,用的是扩展方法
/// <summary>
/// 获取订单状态的百分比进度
/// </summary>
/// <param name="status">传入枚举名称</param>
/// <returns></returns>
public static float GetOrderProgress(this string status)
{
var type = typeof(EnumOrderStatus);
var mInfo = type.GetMembers().FirstOrDefault(p => string.Equals(p.Name, status, StringComparison.OrdinalIgnoreCase));
if (mInfo == null)
return 0f;
var attr = Attribute.GetCustomAttribute(mInfo, typeof(Progress));
if (attr == null)
return 0f;
return ((Progress)attr).ProgressValue;
}4. 获取枚举的特性值:
//var orderInfo = OrderService.Get(orderId); //var progress = orderInfo.OrderStatus.GetOrderProgress(); var progress = "待制作".GetOrderProgress(); Response.Write(progress); //输出25.0