using System;
using System.Reflection;
using System.Collections;
using System.Collections.Generic; namespace AttributeMeta
{
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
public class EnumDescription : Attribute
{ private FieldInfo fieldInfo; public EnumDescription(string text, int rank)
{
this.Text = text;
this.Rank = rank;
} /// <summary>
/// 描述枚举值,默认排序为5
/// </summary>
/// <param name="enumDisplayText">描述内容</param>
public EnumDescription(string text)
: this(text, 5) { } public string Text { get; set; }
public int Rank { get; set; } public int Value
{
get
{
return (int)fieldInfo.GetValue(null);
}
}
public string FieldName
{
get
{
return fieldInfo.Name;
}
} #region 对枚举描述属性的解释相关函数
/// <summary>
/// 排序类型
/// </summary>
public enum SortType
{
/// <summary>
///按枚举顺序默认排序
/// </summary>
Default,
/// <summary>
/// 按描述值排序
/// </summary>
DisplayText,
/// <summary>
/// 按排序熵
/// </summary>
Rank
} private static 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].Text;
} /// <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.fieldInfo.Name == enumValue.ToString())
return ed.Text;
}
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]).fieldInfo = 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].Text, descriptions[n].Text) > 0) swap = true;
break;
case SortType.Rank:
if (descriptions[m].Rank > descriptions[n].Rank) swap = true;
break;
} if (swap)
{
temp = descriptions[m];
descriptions[m] = descriptions[n];
descriptions[n] = temp;
}
}
}
return descriptions;
} /// <summary>
/// 获得枚举类型数据的列表
/// </summary>
/// <param name="enumType">枚举类型</param>
/// <returns>Meta 列表</returns>
public static List<Meta> GetMeta(Type enumType)
{
List<Meta> list = new List<Meta>();
FieldInfo[] fields = enumType.GetFields();
foreach (FieldInfo fi in fields)
{
object[] eds = fi.GetCustomAttributes(typeof(EnumDescription), false);
if (eds.Length != 1)
continue;
((EnumDescription)eds[0]).fieldInfo = fi;
var item = eds[0] as EnumDescription;
Meta meta = new Meta
{
MetaName = item.FieldName,
MetaRank = item.Rank,
MetaText = item.Text,
MetaValue = item.Value
};
list.Add(meta);
}
return list;
} /// <summary>
/// 返回枚举类型数据的哈希表
/// </summary>
/// <param name="enumType">枚举类型</param>
/// <returns>Hashtable</returns>
public static Hashtable GetMetaTable(Type enumType)
{
Hashtable table = new Hashtable();
FieldInfo[] fields = enumType.GetFields();
foreach (FieldInfo fi in fields)
{
object[] eds = fi.GetCustomAttributes(typeof(EnumDescription), false);
if (eds.Length != 1)
continue;
((EnumDescription)eds[0]).fieldInfo = fi;
var item = eds[0] as EnumDescription;
table.Add(item.Value, item.Text);
}
return table;
} /// <summary>
/// 根据枚举值获得枚举文本
/// </summary>
/// <param name="enumType">枚举类型</param>
/// <param name="key">枚举值</param>
/// <returns>Text</returns>
public static object GetMetaValue(Type enumType, int key)
{
object value = null;
Hashtable table = GetMetaTable(enumType);
if (table.Count > 0)
{
value = table[key];
}
return value;
} /// <summary>
/// 根据枚举文本获得枚举值
/// </summary>
/// <param name="enumType">枚举类型</param>
/// <param name="value">枚举文本</param>
/// <returns>Value</returns>
public static object GetMetaKey(Type enumType, string value)
{
object key = null;
Hashtable table = GetMetaTable(enumType);
if (table.Count > 0)
{
foreach (DictionaryEntry de in table)
{
if (de.Value.Equals(value))
{
key = de.Key;
}
}
}
return key;
} #endregion
}
public class Meta
{
public string MetaName { get; set; }
public int MetaValue { get; set; }
public string MetaText { get; set; }
public int MetaRank { get; set; }
}
}

EnumDescription的更多相关文章

  1. [更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能、BUG、细节说明,以及升级思考过程!

    注:ServerSuperIO 2.0 还没有提交到开源社区,在内部测试!!! 1. ServerSuperIO(SSIO)说明 SSIO是基于早期工业现场300波特率通讯传输应用场景发展.演化而来. ...

  2. [更新]跨平台物联网通讯框架 ServerSuperIO v1.2(SSIO),增加数据分发控制模式

    1.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO) 2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案 3.C#工业 ...

  3. [连载]《C#通讯(串口和网络)框架的设计与实现》- 13.中英文版本切换设计

    目       录 第十三章     中英文版本切换设计... 2 13.1        不用自带的资源文件的理由... 2 13.2        配置文件... 2 13.3        语言 ...

  4. [连载]《C#通讯(串口和网络)框架的设计与实现》- 7.外部接口的设计

    目       录 第七章           外部接口的设计... 2 7.1           插件接口... 2 7.2           图形显示接口... 3 7.3           ...

  5. ASP.NET MVC RenderPartial和Partial的区别

    背景:ASP.NET MVC 4.0 @{ Html.RenderPartial(...); } public static void RenderPartial(this HtmlHelper ht ...

  6. 配置NHibernate将枚举保存为Oracle数据库中的字符串

    假设有这样一个枚举: /// <summary> /// 字典项类型 /// </summary> public enum DicItemType { [EnumDescrip ...

  7. C# Enum,Int,String的互相转换

    版权声明:本文为博主原创文章,未经博主允许不得转载. Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用Int32.编程语言通常提供语法来声明由一组已 ...

  8. 适当使用enum做数据字典 ( .net c# winform csharp asp.net webform )

    在一些应用中,通常会用到很多由一些常量来进行描述的状态数据,比如性别(男.女),审核(未审核.已审核)等.在数据库中一般用数字形式来存储,比如0.1等. 不好的做法 经常看到一些应用(ps:最近又看到 ...

  9. 转-C#让枚举返回字符串

    下面的手段是使用给枚举项打标签的方式,来返回字符串 下面分别定义一个属性类,和一个枚举帮助类 [AttributeUsage(AttributeTargets.Field,AllowMultiple  ...

随机推荐

  1. JavaScript : 零基础打造自己的jquery类库

    写作不易,转载请注明出处,谢谢. 文章类别:Javascript基础(面向初学者) 前言 在之前的章节中,我们已经不依赖jQuery,单纯地用JavaScript封装了很多方法,这个时候,你一定会想, ...

  2. Android Base64转图片

    最近做一个项目里面有关于图片展示的需求,但是任性的后台跟我说没有图片服务器,只能给我base64让我自己转成图片,好吧,我忍,转就转吧.. 首先第一步咱还是谦虚点上百度查查别人咋转的,结果似乎各位码友 ...

  3. 【android】getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解

    在自定义控件中使用自定义属性时,经常需要使用java代码获取在xml中定义的尺寸,相关有以下三个函数 getDimension() getDimensionPixelOffset() getDimen ...

  4. android与服务器交互总结(json,post,xUtils,Volley)

    http://www.23code.com/tu-biao-chart/ 从无到有,从来没有接触过Json,以及与服务器的交互.然后慢慢的熟悉,了解了一点.把我学到的东西简单的做个总结,也做个记录,万 ...

  5. Linq查询满足条件记录集

    通过linq查询datatable数据集合满足条件的数据集 1.首先定义查询字段的变量,比方深度 string strDepth=查询深度的值: var dataRows = from datarow ...

  6. android wifi state and wifi ap state

    /** * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if * ...

  7. springMVC前后端分离开发模式下支持跨域请求

    1.web.xml中添加cors规则支持(请修改包名) <filter> <filter-name>cors</filter-name> <filter-cl ...

  8. 安装 - LNMP一键安装包

    https://lnmp.org/ 系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian Linux系统 需要5GB以上硬盘剩余空间 需要128MB以上内存( ...

  9. log4net菜鸟指南二----生成access和txt

    前言 有可能目标计算机缺少某些组件,导致无法生成access文件,或者打不开文件,这时txt文件就可以方便的使用了 一,标准的控制台程序输出日志到access <?xml version=&qu ...

  10. Codeforces Beta Round #1 A. Theatre Square

    从今天開始.就要在Codeforces里有一个新的開始了,貌似任务非常重的说~~ Codeforces专题我将会记录全部通过的题目,事实上仅仅要通过的题目都是水题啊!. 题目大意: 依照要求计算须要多 ...