public static class EnumHelper
{
#region get /// <summary>
/// 获得枚举类型所包含的全部项的列表
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <returns></returns>
public static List<EnumItem> GetEnumItems(Type enumType)
{
return GetEnumItems(enumType, false);
} /// <summary>
/// 获得枚举类型所包含的全部项的列表,包含"All"。
/// </summary>
/// <param name="enumType">枚举对象类型</param>
/// <returns></returns>
public static List<EnumItem> GetEnumItemsWithAll(Type enumType)
{
return GetEnumItems(enumType, true);
} /// <summary>
/// 获得枚举类型所包含的全部项的列表
/// </summary>
/// <param name="enumType">枚举对象类型</param>
/// <param name="withAll">是否需要包含'All'</param>
/// <returns></returns>
public static List<EnumItem> GetEnumItems(Type enumType, bool withAll)
{
List<EnumItem> list = new List<EnumItem>(); if (enumType.IsEnum != true)
{
//whether the type is enum type
throw new InvalidOperationException();
} if (withAll == true)
list.Add(new EnumItem(-, "All")); // 获得特性Description的类型信息
Type typeDescription = typeof(DescriptionAttribute); // 获得枚举的字段信息(因为枚举的值实际上是一个static的字段的值)
System.Reflection.FieldInfo[] fields = enumType.GetFields(); // 检索所有字段
foreach (FieldInfo field in fields)
{
// 过滤掉一个不是枚举值的,记录的是枚举的源类型
if (field.FieldType.IsEnum == false)
continue; // 通过字段的名字得到枚举的值
int value = (int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null);
string text = string.Empty; // 获得这个字段的所有自定义特性,这里只查找Description特性
object[] arr = field.GetCustomAttributes(typeDescription, true);
if (arr.Length > )
{
// 因为Description自定义特性不允许重复,所以只取第一个
DescriptionAttribute aa = (DescriptionAttribute)arr[]; // 获得特性的描述值
text = aa.Description;
}
else
{
// 如果没有特性描述,那么就显示英文的字段名
text = field.Name;
}
list.Add(new EnumItem(value, text));
} return list;
} /// <summary>
/// the the enum value's descrption attribute information
/// </summary>
/// <param name="enumType">the type of the enum</param>
/// <param name="value">the enum value</param>
/// <returns></returns>
public static string GetDescriptionByEnum<T>(T t)
{
if (t == null)
{
return null;
}
Type enumType = typeof(T);
List<EnumItem> list = GetEnumItems(enumType);
foreach (EnumItem item in list)
{
if (Convert.ToInt32(item.Key) == Convert.ToInt32(t))
return item.Value.ToString();
}
return string.Empty;
} public static string GetDescriptionByEnum(object t)
{
if (t == null)
{
return string.Empty;
}
Type enumType = t.GetType();
List<EnumItem> list = GetEnumItems(enumType);
foreach (EnumItem item in list)
{
if (Convert.ToInt32(item.Key) == Convert.ToInt32(t))
return item.Value.ToString();
}
return string.Empty;
} /// <summary>
/// get the enum value's int mode value
/// </summary>
/// <param name="enumType">the type of the enum</param>
/// <param name="value">the enum value's descrption</param>
/// <returns></returns>
public static int GetValueByDescription<T>(string description)
{
Type enumType = typeof(T);
List<EnumItem> list = GetEnumItems(enumType);
foreach (EnumItem item in list)
{
if (item.Value.ToString().ToLower() == description.Trim().ToLower())
return Convert.ToInt32(item.Key);
}
return -;
} /// <summary>
/// get the Enum value according to the its decription
/// </summary>
/// <param name="enumType">the type of the enum</param>
/// <param name="value">the description of the EnumValue</param>
/// <returns></returns>
public static T GetEnumByDescription<T>(string description)
{
if (description == null)
{
return default(T);
}
Type enumType = typeof(T);
List<EnumItem> list = GetEnumItems(enumType);
foreach (EnumItem item in list)
{
if (item.Value.ToString().ToLower() == description.Trim().ToLower())
return (T)item.Key;
}
return default(T);
}
/// <summary>
/// get the description attribute of a Enum value
/// </summary>
/// <param name="enumType">the type of the enum</param>
/// <param name="value">enum value name</param>
/// <returns></returns>
public static T GetEnumByName<T>(string name)
{
Type enumType = typeof(T);
List<EnumItem> list = GetEnumItems(enumType);
bool flag = false;
foreach (EnumItem item in list)
{
if (item.Value.ToString().ToLower() == name.Trim().ToLower())
{
flag = true;
return (T)item.Key;
}
}
if (!flag)
{
throw new ArgumentException("Can not found specify the name of the enum", "name");
}
return default(T);
} public static T GetEnumByValue<T>(object value)
{
bool flag = false;
if (value == null)
throw new ArgumentNullException("value");
try
{
Type enumType = typeof(T);
List<EnumItem> list = GetEnumItems(enumType);
foreach (EnumItem item in list)
{
if (item.Key.ToString().Trim().ToLower() == value.ToString().Trim().ToLower())
{
flag = true;
return (T)item.Key;
}
}
if (!flag)
{
throw new ArgumentException("Can not found specify the value of the enum", "value");
}
return default(T);
}
catch
{
return default(T);
}
}
public static int? GetValueByEnum(object value)
{
if (value == null)
return null;
try
{
return (int)value;
}
catch
{
return null;
}
} #endregion #region Parse Enum
/// <summary>
/// 提供Value的字符,转换为对应的枚举对象
/// <remarks>适用于枚举对象值定义为Char类型的</remarks>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="c"></param>
/// <returns></returns>
public static T Parse<T>(char c) where T : struct
{
return Parse<T>((ulong)c);
} /// <summary>
/// 提供Value的字符,转换为对应的枚举对象
/// <remarks>适用于枚举对象值定义为Int类型的</remarks>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="l"></param>
/// <returns></returns>
public static T Parse<T>(ulong l) where T : struct
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("Need System.Enum as generic type!");
} object o = Enum.Parse(typeof(T), l.ToString());
if (Enum.IsDefined(typeof(T), o))
{
return (T)o;
} throw new InvalidCastException();
} /// <summary>
/// 提供Value的字符,转换为对应的枚举对象
/// <remarks>适用于枚举对象值定义为Char类型的</remarks>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T Parse<T>(string value) where T : struct
{
if (value == null || value.Trim().Length != )
{
throw new ArgumentException("Invalid cast,value must be one character!");
} return Parse<T>(value[]);
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="c"></param>
/// <param name="result"></param>
/// <returns></returns>
public static bool TryParse<T>(char c, out T result) where T : struct
{
return TryParse<T>((ulong)c, out result);
} /// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <param name="result"></param>
/// <returns></returns>
public static bool TryParse<T>(string value, out T result) where T : struct
{
try
{
if (value == null || value.Trim().Length != )
{
throw new ArgumentException("Invalid cast,value must be one character!");
} return TryParse<T>(value[], out result);
}
catch
{
result = default(T);
return false;
}
} /// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <param name="result"></param>
/// <returns></returns>
public static bool TryParse<T>(ulong value, out T result) where T : struct
{
try
{
result = Parse<T>(value);
return true;
}
catch
{
result = default(T);
return false;
}
}
#endregion
} public class EnumItem
{ private object m_key;
private object m_value; public object Key
{
get { return m_key; }
set { m_key = value; }
} public object Value
{
get { return m_value; }
set { m_value = value; }
} public EnumItem(object _key, object _value)
{
m_key = _key;
m_value = _value;
}
}

Enum Helper的更多相关文章

  1. C#中Enum的用法

    1.定义枚举类型 public enum Test { 男 = 0, 女 = 1 } 2.获取枚举值 public void EnumsAction() { var s = Test.男;//男 va ...

  2. [ASP.NET MVC 小牛之路]13 - Helper Method

    我们平时编程写一些辅助类的时候习惯用“XxxHelper”来命名.同样,在 MVC 中用于生成 Html 元素的辅助类是 System.Web.Mvc 命名空间下的 HtmlHelper,习惯上我们把 ...

  3. Helper Method

    ASP.NET MVC 小牛之路]13 - Helper Method 我们平时编程写一些辅助类的时候习惯用“XxxHelper”来命名.同样,在 MVC 中用于生成 Html 元素的辅助类是 Sys ...

  4. [2014-09-21]如何在 Asp.net Mvc 开发过程中更好的使用Enum

    场景描述 在web开发过程中,有时候需要根据Enum类型生成下拉菜单: 有时候在输出枚举类型的时候,又希望输出对应的更具描述性的字符串. 喜欢直接用中文的请无视本文 不多说,直接看代码. 以下代码借鉴 ...

  5. C# EnumHelper Enum的值,Description,ToString()的相互转换

    首先定义枚举类型,如下: /// <summary> /// 板块 /// </summary> public enum Plate {         [Descriptio ...

  6. Windows解决多版本python执行pip3时出错AttributeError: module 'enum' has no attribute 'IntFlag'?

    摘要: 本机装有python2.7和python3.6,执行pip和pip2时没有问题,执行pip3时提示: C:\Users\>pip3 Traceback (most recent call ...

  7. 微软原版SQL Helper

    代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...

  8. Netfilter 之 连接跟踪的helper

    注册helper nf_conntrack_ftp_init是连接跟踪ftp模块的初始化函数,可以看到其调用了nf_conntrack_helpers_register来注册helper: stati ...

  9. python3 enum模块

    枚举是绑定到唯一的常量值的一组符号名称(成员).在枚举中,成员可以通过身份进行比较,枚举本身可以迭代. 1.Enum模块 该模块定义了四个枚举类,可用于定义唯一的名称和值集:Enum,IntEnum, ...

随机推荐

  1. Requirejs加载超时问题的一个解决方法:设置waitSeconds=0

    有时Requirejs会遇到加载js超时问题 除了排查js脚本问题,网络问题以外的一个解决方法是加大Require的等待时间waitSeconds,或者直接设置为0,这个参数的意义是:The numb ...

  2. [转] Autofac创建实例的方法总结

    1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 官方文档解释:Configure the component so tha ...

  3. Asp.net Core 使用Redis存储Session

    前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储Session来做一个简单的测试,或者叫做中间件(middleware). 对于Session来说褒贬不一, ...

  4. RAID卡

        简单的说,RAID是一种把多块独立的物理硬盘按不同方式组合起来形成一个逻辑硬盘,从而提供比单个硬盘有着更高的性能和提供数据冗余的技术.     RAID卡一般分为硬RAID卡和软RAID卡两种 ...

  5. 简单的freemarker解析测试

    本文是一个很简单很基础的Freemarker模板解析测试类,复杂的也是在此基础上添加一些代码优化而来,懂得基础流程后就能融会贯通了 POM: <dependency> <groupI ...

  6. Android 6.0 源代码编译实践

    http://www.judymax.com/archives/1087 Android 6.0 源代码编译实践 https://mirrors.tuna.tsinghua.edu.cn/help/A ...

  7. C# 接口的隐式与显示实现

    隐式实现的话实现的方法属于实现的类的,可以直接通过类的对象访问,显式实现的话方法是属于接口的,可以看成是寄托在类中实现的,访问这些方法时要先把对象转换成接口对象,然后通过接口对象调用 一般来讲显式实现 ...

  8. Kafka 消息监控 - Kafka Eagle

    1.概述 在开发工作当中,消费 Kafka 集群中的消息时,数据的变动是我们所关心的,当业务并不复杂的前提下,我们可以使用 Kafka 提供的命令工具,配合 Zookeeper 客户端工具,可以很方便 ...

  9. Winform 数据库连接app.config文件配置 数据库连接字符串

    1.添加配置文件 新建一个winform应用程序,类似webfrom下有个web.config,winform下也有个App.config;不过 App.config不是自动生成的需要手动添加,鼠标右 ...

  10. JS - Cookie: getCookie, setCookie

    JS function for Cookie 如果cookie未设置,判断时与空字符串‘’比较: function setCookie(cname, cvalue, exdays) { var d = ...