我提供一方法,也是用反射
伪代码
枚举类中定义:
public enum Gender
{
[EnumDescription("男")]
Male = 0,
[EnumDescription("女")]
Female = 1,
}
EnumDescription.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Collections;
namespace SanofiAventis.Ocm.Framework.Common
{
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
public class EnumDescription : Attribute
{
private string enumDisplayText;
private int enumRank;
private FieldInfo fieldIno;
public EnumDescription(string enumDisplayText, int enumRank)
{
this.enumDisplayText = enumDisplayText;
this.enumRank = enumRank;
}
public EnumDescription(string enumDisplayText)
: this(enumDisplayText, 5) { }
public string EnumDisplayText
{
get { return this.enumDisplayText; }
}
public int EnumRank
{
get { return enumRank; }
}
public int EnumValue
{
get { return (int)fieldIno.GetValue(null); }
}
public string FieldName
{
get { return fieldIno.Name; }
}
#region =========================================对枚举描述属性的解释相关函数
/// <summary>
/// 排序类型
/// </summary>
public enum SortType
{
/// <summary>
///按枚举顺序默认排序
/// </summary>
Default,
/// <summary>
/// 按描述值排序
/// </summary>
DisplayText,
/// <summary>
/// 按排序
/// </summary>
Rank
}
private static System.Collections.Hashtable cachedEnum = new Hashtable();
public static string GetEnumText(Type enumType)
{
EnumDescription[] eds = (EnumDescription[])enumType.GetCustomAttributes(typeof(EnumDescription), false);
if (eds.Length != 1) return string.Empty;
return eds[0].EnumDisplayText;
}
public static string GetFieldText(object enumValue)
{
EnumDescription[] descriptions = GetFieldTexts(enumValue.GetType(), SortType.Default);
foreach (EnumDescription ed in descriptions)
{
if (ed.fieldIno.Name == enumValue.ToString()) return ed.EnumDisplayText;
}
return string.Empty;
}
public static EnumDescription[] GetFieldTexts(Type enumType)
{
return GetFieldTexts(enumType, SortType.Default);
}
public static EnumDescription[] GetFieldTexts(Type enumType, SortType sortType)
{
EnumDescription[] descriptions = null;
if (cachedEnum.Contains(enumType.FullName) == false)
{
FieldInfo[] fields = enumType.GetFields();
ArrayList edAL = new ArrayList();
foreach (FieldInfo fi in fields)
{
object[] eds = fi.GetCustomAttributes(typeof(EnumDescription), false);
if (eds.Length != 1) continue;
((EnumDescription)eds[0]).fieldIno = fi;
edAL.Add(eds[0]);
}
cachedEnum.Add(enumType.FullName, (EnumDescription[])edAL.ToArray(typeof(EnumDescription)));
}
descriptions = (EnumDescription[])cachedEnum[enumType.FullName];
if (descriptions.Length <= 0) throw new NotSupportedException("枚举类型[" + enumType.Name + "]未定义属性EnumValueDescription");
//按指定的属性冒泡排序
for (int m = 0; m < descriptions.Length; m++)
{
//默认就不排序了
if (sortType == SortType.Default) break;
for (int n = m; n < descriptions.Length; n++)
{
EnumDescription temp;
bool swap = false;
switch (sortType)
{
case SortType.Default:
break;
case SortType.DisplayText:
if (string.Compare(descriptions[m].EnumDisplayText, descriptions[n].EnumDisplayText) > 0) swap = true;
break;
case SortType.Rank:
if (descriptions[m].EnumRank > descriptions[n].EnumRank) swap = true;
break;
}
if (swap)
{
temp = descriptions[m];
descriptions[m] = descriptions[n];
descriptions[n] = temp;
}
}
}
return descriptions;
}
#endregion
}
}
操作。。。。。
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
namespace SanofiAventis.Ocm.Framework.Common
{
public class CustomerUtility
{
/// <summary>
/// 把枚举类型绑定到DropDownList
/// </summary>
/// <param name="ddl"></param>
/// <param name="type"></param>
/// <param name="Englist"></param>
public static void BindDropDownList(DropDownList ddl,Type type,bool Englist)
{
EnumDescription[] eList = EnumDescription.GetFieldTexts(type);
foreach (EnumDescription e in eList)
{
if (!Englist)
{
ddl.Items.Add(new ListItem(e.EnumDisplayText, e.EnumValue.ToString()));
}
else
{
ddl.Items.Add(new ListItem(e.FieldName, e.EnumValue.ToString()));
}
}
}
/// <summary>
/// 根据枚举值获取Text
/// </summary>
/// <param name="enumType"></param>
/// <param name="value"></param>
/// <param name="English"></param>
/// <returns></returns>
public static string GetEnumTextByValue(Type enumType,int value,bool English)
{
EnumDescription[] eList = EnumDescription.GetFieldTexts(enumType);
foreach(EnumDescription e in eList)
{
if(e.EnumValue == value)
{
return English ? e.FieldName:e.EnumDisplayText;
}
}
return "";
}
}
}
当然,我这个方法也不是最好的,比如,双语还可以实现,但多语言版就不太好用了。得重写EnumDescription