获取Enum枚举值描述的几法方法
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: dearzp@hotmail.com
/// </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】
获取Enum枚举值描述的几法方法的更多相关文章
- Enum 枚举值 (一) 获取描述信息
封装了方法: public static class EnumOperate { public class BaseDescriptionAttribute : DescriptionAttribut ...
- MVC3不能正确识别JSON中的Enum枚举值
一.背景 在MVC3项目里,如果Action的参数中有Enum枚举作为对象属性的话,使用POST方法提交过来的JSON数据中的枚举值却无法正确被识别对应的枚举值. 二.Demo演示 为了说明问题,我使 ...
- C#获取存储过程返回值和输出参数值的方法
//转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...
- JavaScript or jQuery 获取option value值 以及文本内容的方法
1.html <div class="form-group"> <label>保险公司</label> <select class=&qu ...
- java enum 枚举值
public enum PieChartEnum { PIE00("pie00"), PIE10("pie10"), PIE11("pie11&quo ...
- WebApi用Post的方式提交Json时,获取不到值或不进对应方法的问题
又是一个通宵,终于搞明白了. 被WebApi坑得好惨. 之前用各种方法Post上来,有时可以读到结构,但没值,有时直接就是一个Null,有时连方法都没进就跑了,只是来控制器里看了一下…… 最后好友说还 ...
- SqlParameter设定的value值为0时、调用的存储过程获取到的值却为null解决方法
原C#代码如下: if (query != null) { switch (query.MethodFlag) { //进出口退补税额统计表 case (int)EnumClassifyCorrect ...
- jquery获取下拉列表的值和显示内容的方法
页面的下拉列表: 选择时间段: <select name="timespan" id="timespan" class="Wdate" ...
- Enum扩展及MVC中DropDownListFor扩展方法的使用
public enum SearchState { /// <summary> /// 全部 /// </summary> [Description("全部" ...
随机推荐
- 基于visual Studio2013解决C语言竞赛题之1063分橘子
题目 解决代码及点评 /* 功能:某桔农家共有2520只桔子, 父亲要将它们分给六个儿子,其分法如下: 父亲先将2520只桔子分给六个儿子, 然后说:"老大,把你分到的桔子 ...
- 教会你如何编写makefile文件
最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...
- linxu select 返回值
#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <netin ...
- Python 自动化测试报告HTMLTestRunner
HTMLTestRunner 是Python的一个测试报告 参考网址: http://tungwaiyip.info/software/HTMLTestRunner.html https://pypi ...
- SqlHelper初探之二
在上一篇简单的介绍了sqlhelper的基本知识,接下来就让我们进一步学习他的实践过程. 首先:我们要明白的一件事Sqlhelper不是写出来的,而是在D层的代码中提炼出来的?那么就会反问一句“D层中 ...
- 被忽视的META标签之特效
在web设计中使用js可以实现很多的页面特效,然而很多人却忽视了HTML标签中META标签的强大功效,其实meta标签也可以实现很多漂亮的页面过渡效果. META标签是HTML语言HEAD区的一个辅助 ...
- 3-04. 一元多项式的乘法与加法运算(20)(ZJU_PAT 结构体)
题目链接:http://pat.zju.edu.cn/contests/ds/3-04 设计函数分别求两个一元多项式的乘积与和. 输入格式说明: 输入分2行.每行分别先给出多项式非零项的个数.再以指数 ...
- DM8168硬件平台
DM8168硬件平台 作者:Marvin_wu TMS320DM8168是一款多核SoC,它集成了包含ARM Cortex A8.DSP C674X+.M3 VIDEO.M3 VPSS等处理器.DS ...
- [页面模板框架对比] Apache Tiles VS Sitemesh
1. 原理对比 (1) Apache Tiles 顾名思义,Tile是瓷砖的意思,也就是说一个网页是由多个Tile组成的. 用户通过访问一个页面的Apache Tiles定义名,就可以访问一个由定义文 ...
- c friend -- 友元
c friend -- 友元 友元用于突破protected 或者 private 保护的限制,首先要做的是在被访问者的类中声明是友元函数或者友元类.代码如下 #include <iostrea ...