枚举是很多编程语言中的常用数据类型,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);
}
}
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册