1.定義枚舉時直接用中文
由於VS對中文支持的很不錯,所以很多程序員都採用了此方案.
缺點:1.不適合多語言 2.感覺不太完美,畢竟大部分程序員大部分代碼都使用英文
缺點:不適合多語言
原文:http://www.cnblogs.com/hilite/archive/2006/03/28/360793.html
枚舉定義:
[EnumDescription("訂單、訂單中的產品、產品項的狀態。")]
public enum OrderStateEnum
{
[EnumDescription("未開始")]
Ready = 0,
[EnumDescription("進行中")]
Processing,
[EnumDescription("等待中")]
Waiting,
[EnumDescription("取消")]
Canceled,
[EnumDescription("完成")]
Finished
}
代碼訪問:
0、獲得枚舉類型的文字描述
string txt = EnumDescription.GetEnumText(typeof(OrderStateEnum));
1、獲得某個枚舉值的文字描述:
string txt = EnumDescription.GetFieldText(OrderStateEnum.Processing)
2、獲得枚舉中各個字段的定義數組:
EnumDescription[] des = EnumDescription.GetFieldTexts(typeof(OrderStateEnum))
如果需要排序,通過他的另一個重載
public static EnumDescription[] GetFieldTexts( Type enumType, SortType sortType )
3、綁定到下拉框:
comboBox1.DataSource = EnumDescription.GetFieldTexts(typeof(OrderStateEnum));
comboBox1.ValueMember = "EnumValue";
comboBox1.DisplayMember = "EnumDisplayText";
comboBox1.SelectedValue = (int)OrderStateEnum.Finished; //選中值
EnumDisplayText.cs 源碼
using System;
using System.Reflection;
using System.Collections;
using System.Text;
namespace BirdSof
{
/// <summary>
/// 把枚舉值按照指定的文本顯示
/// <remarks>
/// 一般通過枚舉值的ToString()可以得到變量的文本,
/// 但是有時候需要的到與之對應的更充分的文本,
/// 這個類幫助達到此目的
/// Date: 2006-3-25
/// Author: [email protected]
/// </remarks>
/// </summary>
/// <example>
/// [EnumDescription("中文數字")]
/// enum MyEnum
/// {
/// [EnumDescription("數字一")]
/// One = 1,
///
/// [EnumDescription("數字二")]
/// Two,
///
/// [EnumDescription("數字三")]
/// Three
/// }
/// EnumDescription.GetEnumText(typeof(MyEnum));
/// EnumDescription.GetFieldText(MyEnum.Two);
/// EnumDescription.GetFieldTexts(typeof(MyEnum));
/// </example>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
public class EnumDescription : Attribute
{
private string enumDisplayText;
private int enumRank;
private FieldInfo fieldIno;
/// <summary>
/// 描述枚舉值
/// </summary>
/// <param name="enumDisplayText">描述內容</param>
/// <param name="enumRank">排列順序</param>
public EnumDescription( string enumDisplayText, int enumRank )
{
this.enumDisplayText = enumDisplayText;
this.enumRank = enumRank;
}
/// <summary>
/// 描述枚舉值,默認排序爲5
/// </summary>
/// <param name="enumDisplayText">描述內容</param>
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();
/// <summary>
/// 得到對枚舉的描述文本
/// </summary>
/// <param name="enumType">枚舉類型</param>
/// <returns></returns>
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;
}
/// <summary>
/// 獲得指定枚舉類型中,指定值的描述文本。
/// </summary>
/// <param name="enumValue">枚舉值,不要作任何類型轉換</param>
/// <returns>描述字符串</returns>
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;
}
/// <summary>
/// 得到枚舉類型定義的所有文本,按定義的順序返回
/// </summary>
/// <exception cref="NotSupportedException"></exception>
/// <param name="enumType">枚舉類型</param>
/// <returns>所有定義的文本</returns>
public static EnumDescription[] GetFieldTexts( Type enumType )
{
return GetFieldTexts(enumType, SortType.Default);
}
/// <summary>
/// 得到枚舉類型定義的所有文本
/// </summary>
/// <exception cref="NotSupportedException"></exception>
/// <param name="enumType">枚舉類型</param>
/// <param name="sortType">指定排序類型</param>
/// <returns>所有定義的文本</returns>
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
}
}
下載地址:原文下載
3.NBear提供的綁定Enum到ASP.NET數據綁定控件的完美解決方案(博客園-Teddy)
(支持第三方枚舉描述,支持二進制與過的枚舉值)
原文:http://www.cnblogs.com/teddyma/archive/2007/05/25/759842.html
EnumDescriptionAttribute.cs 源碼
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace NBear.Common
{
[AttributeUsage(AttributeTargets.Field, AllowMultiple=false, Inherited=true)]
public class EnumDescriptionAttribute : Attribute
{
private string defaultDesc;
public string DefaultDescription
{
get
{
return defaultDesc;
}
set
{
defaultDesc = value;
}
}
public virtual string GetDescription(object enumValue)
{
Check.Require(enumValue != null, "enumValue could not be null.");
return DefaultDescription ?? enumValue.ToString();
}
public static string GetDescription(Type enumType, int enumIntValue)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
Dictionary<int, string> descs = EnumDescriptionAttribute.GetDescriptions(enumType);
Dictionary<int, string>.Enumerator en = descs.GetEnumerator();
while (en.MoveNext())
{
if ((enumIntValue & en.Current.Key) == en.Current.Key)
{
if (sb.Length == 0)
{
sb.Append(en.Current.Value);
}
else
{
sb.Append(',');
sb.Append(en.Current.Value);
}
}
}
return sb.ToString();
}
public static Dictionary<int, string> GetDescriptions(Type enumType)
{
Check.Require(enumType != null && enumType.IsEnum, "enumType must be an enum type.");
FieldInfo[] fields = enumType.GetFields();
Dictionary<int, string> descs = new Dictionary<int, string>();
for (int i = 1; i < fields.Length; ++i)
{
object fieldValue = Enum.Parse(enumType, fields[i].Name);
object[] attrs = fields[i].GetCustomAttributes(true);
bool findAttr = false;
foreach (object attr in attrs)
{
if (typeof(EnumDescriptionAttribute).IsAssignableFrom(attr.GetType()))
{
descs.Add((int)fieldValue, ((EnumDescriptionAttribute)attr).GetDescription(fieldValue));
findAttr = true;
break;
}
}
if (!findAttr)
{
descs.Add((int)fieldValue, fieldValue.ToString());
}
}
return descs;
}
}
}
使用方法:
枚舉定義(普通)
public enum SimpleStatus
{
[NBear.Common.EnumDescription(DefaultDescription="Desc of Value1")]
Value1 = 1,
[NBear.Common.EnumDescription(DefaultDescription="Desc of Value2")]
Value2 = 2
}
枚舉定義(繼承)
public class MyEnumDescriptionAttribute : NBear.Common.EnumDescriptionAttribute
2 {
3 private static string[] customDescs = new string[] { "custom desc of Value1", null }; //the second value is null here to use the DefaultDescription set in enum definition
4
5 public override string GetDescription(object enumValue)
6 {
7 return customDescs[(int)enumValue] ?? base.GetDescription(enumValue);
8 }
9 }
使用EnumDescriptionAttribute以透明獲取的枚舉值描述信息。
調用EnumDescriptionAttribute.GetDescriptions(enumType)這個靜態方法就可以得到指定枚舉類型的所有枚舉值的由EnumDescriptionAttribute或其繼承類標註的描述信息。
【只爲參考,引用於 http://www.yaosansi.com/post/1375.html】