EnumDescription
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的更多相关文章
- [更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能、BUG、细节说明,以及升级思考过程!
注:ServerSuperIO 2.0 还没有提交到开源社区,在内部测试!!! 1. ServerSuperIO(SSIO)说明 SSIO是基于早期工业现场300波特率通讯传输应用场景发展.演化而来. ...
- [更新]跨平台物联网通讯框架 ServerSuperIO v1.2(SSIO),增加数据分发控制模式
1.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO) 2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案 3.C#工业 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 13.中英文版本切换设计
目 录 第十三章 中英文版本切换设计... 2 13.1 不用自带的资源文件的理由... 2 13.2 配置文件... 2 13.3 语言 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 7.外部接口的设计
目 录 第七章 外部接口的设计... 2 7.1 插件接口... 2 7.2 图形显示接口... 3 7.3 ...
- ASP.NET MVC RenderPartial和Partial的区别
背景:ASP.NET MVC 4.0 @{ Html.RenderPartial(...); } public static void RenderPartial(this HtmlHelper ht ...
- 配置NHibernate将枚举保存为Oracle数据库中的字符串
假设有这样一个枚举: /// <summary> /// 字典项类型 /// </summary> public enum DicItemType { [EnumDescrip ...
- C# Enum,Int,String的互相转换
版权声明:本文为博主原创文章,未经博主允许不得转载. Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用Int32.编程语言通常提供语法来声明由一组已 ...
- 适当使用enum做数据字典 ( .net c# winform csharp asp.net webform )
在一些应用中,通常会用到很多由一些常量来进行描述的状态数据,比如性别(男.女),审核(未审核.已审核)等.在数据库中一般用数字形式来存储,比如0.1等. 不好的做法 经常看到一些应用(ps:最近又看到 ...
- 转-C#让枚举返回字符串
下面的手段是使用给枚举项打标签的方式,来返回字符串 下面分别定义一个属性类,和一个枚举帮助类 [AttributeUsage(AttributeTargets.Field,AllowMultiple ...
随机推荐
- 编写Web Serviceclient訪问www.webxml.com.cn提供的服务
好久没更新博客了,近期各种忙. 之前做Web Service课程的作业,当中有一个实验.实验内容如题所看到的. 以下简单说下怎样编写Web Serviceclient訪问webxml.com.cn里的 ...
- update tableView contenSize
NSIndexPath *messageIndexPath = [NSIndexPath indexPathForRow:afterRowCount-1 inSection:0]; [self. ...
- 关于在 C#中无法静态库引用的解决方法
在VS中用C#写了个类库,后面想转成静态库发现没有直接的方法,原来在C++中可以,而C#中不支持. 但是有时候程序引用C#编写的动态库觉得用户体验不好太累赘,想要简单只发一个exe可执行程序给用户就好 ...
- html嵌套规则
本人半路出家的 今天学习js的时候写了一个a嵌套a标签结果js报错 一直找不到原因 专门找了一下html嵌套规则看了一下 1.块级元素 一般用来搭建网站架构.布局.承载内容……它包括以下这些标签: ...
- nyoj43 24 Point game(DFS)
题目43 题目信息 pid=43" style="text-decoration:none; color:rgb(55,119,188)">执行结果 本题排行 讨论 ...
- java开始到熟悉105-107
1,HashMap基本用法 package list; import java.util.HashMap; import java.util.Map; /** * 测试map的基本用法 * @auth ...
- iOS----FMDB---看这个可以解决大部分你遇到的问题
SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库. iOS SDK很早就支持了SQLite,在使用时,只需要加入 libsqlite3.dyl ...
- C#数据类型与数据库字段类型对应
数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean char string datetime Sy ...
- SWIM接口及STM8烧录过程
1. 硬件连接 SWIM接口只需要一根传输线,即可完成双向的传输.传输过程,都是由主控制端(host)发起,设备端然后做出反应.host端需要在一个总线上实现读和写,那就是说必须要同时接一个输出IO和 ...
- HTTPS那些事儿(一)-HTTPS原理
HTTPS那些事儿(一) 近期看了<http权威指南>的几个章节.对HTTPS有了部分了解,同一时候在网上查阅了一些资料,遂打算记录一下心得,写的仓促,肯定有非常多错误的地方.欢迎大家指正 ...