□enum概述:
Msdn对enum的说明:enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。枚举元素的默认基础类型为 int。默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增1。
例如:enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
□enum扩展:
在实际的使用中,我们常常希望枚举类型对应的基础类型是字符串类型的。如:enum Country{中国, 美国, 日本};如果Country.中国,那么对应的值是“China”,而不是整数0.
如何实现呢?Java中有Enum类可以实现类似功能,而C#中Enum不允许继承,所以大家公认比较好的做法是使用.Net Framework3.5的Attribute曲线救国。
□实现思路:
1. 创建ItemDiscAttribute类(继承自Attribute),实现自定义属性。
2. 创建enum时,为其子项设置自定义属性。
3. 为Enum创建扩展方法,读取自定义属性,实现Enum和自定义属性的映射。
□具体实现:
(一)自定义属性类ItemDiscAttribute:
[AttributeUsage(AttributeTargets.Field)]
public class ItemDiscAttribute : Attribute
{
/// <summary>
///
/// </summary>
private string _Description;
/// <summary>
///
/// </summary>
public string Description
{
get { return _Description; }
set { _Description = Description; }
}
/// <summary>
///
/// </summary>
/// <param name="Description"></param>
public ItemDiscAttribute(string Description)
{
_Description = Description;
}
}
(二)实现扩展方法:
public static class EnumEx
{
private static Dictionary<Enum, string> dictDiscs = new Dictionary<Enum, string>();
public static string Discription(this Enum myEnum)
{
string strDisc = string.Empty;
if (dictDiscs.ContainsKey(myEnum))
{
strDisc = dictDiscs[myEnum];
}
else
{
strDisc = GetDiscription(myEnum);
dictDiscs.Add(myEnum, strDisc);
}
return strDisc;
}
private static string GetDiscription(Enum myEnum)
{
FieldInfo fieldInfo = myEnum.GetType().GetField(myEnum.ToString());
object[] attrs = fieldInfo.GetCustomAttributes(typeof(ItemDiscAttribute), true);
if (attrs != null && attrs.Length > 0)
{
ItemDiscAttribute desc = attrs[0] as ItemDiscAttribute;
if (desc != null)
{
return desc.Description;
}
}
return myEnum.ToString();
}
}
(三)用例:
enum Country
{
[ItemDisc("China")]
中国,
[ItemDisc("USA")]
美国,
[ItemDisc("Japan")]
日本
};
static void Main()
{
Console.WriteLine("Name=/"{0}/", Code=/"{1}/"", Country.中国.ToString(), Country.中国.Discription());
}
(四)输出:
Name="中国", Code="China"