更新说明:
推荐 Enums.NET 开源组件处理 C# 枚举。这里是我整理的 Demo:https://files.cnblogs.com/files/Music/Enums.NET_Demo_VeryGood.rar
把枚举值按照指定的文本显示,一般通过枚举值的ToString()可以得到变量的文本,但是有时候需要的到与之对应的更充分的文本,这个类帮助达到此目的。
代码如下:
using System;
using System.Reflection;
using System.Collections;
using System.Text;
namespace ImageWaterMark
{
/// <summary>
/// 把枚举值按照指定的文本显示
/// <remarks>
/// 一般通过枚举值的ToString()可以得到变量的文本,
/// 但是有时候需要的到与之对应的更充分的文本,
/// 这个类帮助达到此目的。
/// </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; }
}
/// <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;
}
/* 用法 */
/*
string txt = EnumDescription.GetEnumText(typeof(OrderStateEnum));
string txt = EnumDescription.GetFieldText(OrderStateEnum.Processing);
EnumDescription[] des = EnumDescription.GetFieldTexts(typeof(OrderStateEnum))
public static EnumDescription[] GetFieldTexts( Type enumType, SortType sortType )
*/
}
}
绑定到 DropDownList:
this.ddlWaterImgPosition.DataTextField = "EnumDisplayText"; /* 绑定到 DropDownList */
this.ddlWaterImgPosition.DataValueField = "EnumValue";
this.ddlWaterImgPosition.DataSource = EnumDescription.GetFieldTexts(typeof(ImagePosition)); /* 其中 ImagePosition 是枚举类型 */
this.ddlWaterImgPosition.DataBind();
ImagePosition.cs 代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
namespace ImageWaterMark
{
public enum ImagePosition
{
/// <summary>
/// 默认
/// </summary>
[EnumDescription("默认",1)]
Default = 0,
/// <summary>
/// 左上方
/// </summary>
[EnumDescription("左上方")]
LeftTop = 1,
/// <summary>
/// 正上方
/// </summary>
[EnumDescription("正上方")]
Top = 2,
/// <summary>
/// 右上方
/// </summary>
[EnumDescription("右上方")]
RightTop = 3,
/// <summary>
/// 左边
/// </summary>
[EnumDescription("左边")]
Left = 4,
/// <summary>
/// 正中
/// </summary>
[EnumDescription("正中")]
Middle = 5,
/// <summary>
/// 右边
/// </summary>
[EnumDescription("右边")]
Right = 6,
/// <summary>
/// 左下方
/// </summary>
[EnumDescription("左下方")]
LeftBottom = 7,
/// <summary>
/// 正下方
/// </summary>
[EnumDescription("正下方")]
Bottom = 8,
/// <summary>
/// 右下方
/// </summary>
[EnumDescription("右下方")]
RightBottom = 9
}
}
等待更新...