using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Nirvana.Common
{
public class EnumHelper
{
///
/// 转换如:"enum1,enum2,enum3"字符串到枚举值
///
/// 枚举类型
/// 枚举字符串
///
public static T Parse(string obj)
{
if (string.IsNullOrEmpty(obj))
return default(T);
else
return (T)Enum.Parse(typeof(T), obj);
}
public static T TryParse(string obj, T defT = default(T))
{
try
{
return Parse(obj);
}
catch
{
return defT;
}
}
public static readonly string ENUM_TITLE_SEPARATOR = ",";
///
/// 根据枚举值,返回描述字符串
/// 如果多选枚举,返回以","分割的字符串
///
///
///
public static string GetEnumTitle(Enum e)
{
if (e == null)
{
return "";
}
string[] valueArray = e.ToString().Split(ENUM_TITLE_SEPARATOR.ToArray(), StringSplitOptions.RemoveEmptyEntries);
Type type = e.GetType();
string ret = "";
foreach (string enumValue in valueArray)
{
System.Reflection.FieldInfo fi = type.GetField(enumValue.Trim());
if (fi == null)
continue;
EnumTitleAttribute[] attrs = fi.GetCustomAttributes(typeof(EnumTitleAttribute), false) as EnumTitleAttribute[];
if (attrs != null && attrs.Length > 0 && attrs[0].IsDisplay)
{
ret += attrs[0].Title + ENUM_TITLE_SEPARATOR;
}
}
return ret.TrimEnd(ENUM_TITLE_SEPARATOR.ToArray());
}
///
/// 根据枚举值,返回描述字符串
/// 如果多选枚举,返回以","分割的字符串
///
///
///
public static string GetAllEnumTitle(Enum e)
{
if (e == null)
{
return "";
}
string[] valueArray = e.ToString().Split(ENUM_TITLE_SEPARATOR.ToArray(), StringSplitOptions.RemoveEmptyEntries);
Type type = e.GetType();
string ret = "";
foreach (string enumValue in valueArray)
{
System.Reflection.FieldInfo fi = type.GetField(enumValue.Trim());
if (fi == null)
continue;
EnumTitleAttribute[] attrs = fi.GetCustomAttributes(typeof(EnumTitleAttribute), false) as EnumTitleAttribute[];
if (attrs != null && attrs.Length > 0)
{
ret += attrs[0].Title + ENUM_TITLE_SEPARATOR;
}
}
return ret.TrimEnd(ENUM_TITLE_SEPARATOR.ToArray());
}
public static EnumTitleAttribute GetEnumTitleAttribute(Enum e)
{
if (e == null)
{
return null;
}
string[] valueArray = e.ToString().Split(ENUM_TITLE_SEPARATOR.ToArray(), StringSplitOptions.RemoveEmptyEntries);
Type type = e.GetType();
EnumTitleAttribute ret = null;
foreach (string enumValue in valueArray)
{
System.Reflection.FieldInfo fi = type.GetField(enumValue.Trim());
if (fi == null)
continue;
EnumTitleAttribute[] attrs = fi.GetCustomAttributes(typeof(EnumTitleAttribute), false) as EnumTitleAttribute[];
if (attrs != null && attrs.Length > 0)
{
ret = attrs[0];
break;
}
}
return ret;
}
public static string GetDayOfWeekTitle(DayOfWeek day)
{
switch (day)
{
case DayOfWeek.Monday:
return "周一";
case DayOfWeek.Tuesday:
return "周二";
case DayOfWeek.Wednesday:
return "周三";
case DayOfWeek.Thursday:
return "周四";
case DayOfWeek.Friday:
return "周五";
case DayOfWeek.Saturday:
return "周六";
case DayOfWeek.Sunday:
return "周日";
default:
return "";
}
}
///
/// 返回键值对,建为枚举的EnumTitle中指定的名称和近义词名称,值为枚举项
///
/// 枚举类型
///
///
public static Dictionary GetTitleAndSynonyms() where T : struct
{
Dictionary ret = new Dictionary();
//枚举值
Array arrEnumValue = typeof(T).GetEnumValues();
foreach (object enumValue in arrEnumValue)
{
System.Reflection.FieldInfo fi = typeof(T).GetField(enumValue.ToString());
if (fi == null)
{
continue;
}
EnumTitleAttribute[] arrEnumTitleAttr = fi.GetCustomAttributes(typeof(EnumTitleAttribute), false) as EnumTitleAttribute[];
if (arrEnumTitleAttr == null || arrEnumTitleAttr.Length < 1 || !arrEnumTitleAttr[0].IsDisplay)
{
continue;
}
if (!ret.ContainsKey(arrEnumTitleAttr[0].Title))
{
ret.Add(arrEnumTitleAttr[0].Title, (T)enumValue);
}
if (arrEnumTitleAttr[0].Synonyms == null || arrEnumTitleAttr[0].Synonyms.Length < 1)
{
continue;
}
foreach (string s in arrEnumTitleAttr[0].Synonyms)
{
if (!ret.ContainsKey(s))
{
ret.Add(s, (T)enumValue);
}
}
}//using
return ret;
}
///
/// 根据枚举获取包含所有所有值和描述的哈希表,其文本是由应用在枚举值上的EnumTitleAttribute设定
///
///
public static Dictionary GetItemList() where T : struct
{
return GetItemValueList(false);
}
///
/// 根据枚举获取包含所有所有值和描述的哈希表,其文本是由应用在枚举值上的EnumTitleAttribute设定
///
///
public static Dictionary GetAllItemList() where T : struct
{
return GetItemValueList(true);
}
///
/// 获取枚举所有项的标题,其文本是由应用在枚举值上的EnumTitleAttribute设定
///
/// 枚举类型
/// 语言
///
public static Dictionary GetItemValueList() where T : struct
{
return GetItemValueList(false);
}
///
/// 获取枚举所有项的标题,其文本是由应用在枚举值上的EnumTitleAttribute设定
///
/// 枚举类型
/// 是否生成“全部”项
/// 语言
///
public static Dictionary GetItemValueList(bool isAll) where T : struct
{
if (!typeof(T).IsEnum)
{
throw new Exception("参数必须是枚举!");
}
Dictionary ret = new Dictionary();
var titles = EnumHelper.GetItemAttributeList().OrderBy(t => t.Value.Order);
foreach (var t in titles)
{
if (!isAll && (!t.Value.IsDisplay || t.Key.ToString() == "None"))
continue;
if (t.Key.ToString() == "None" && isAll)
{
ret.Add((TKey)(object)t.Key, "全部");
}
else
{
if (!string.IsNullOrEmpty(t.Value.Title))
ret.Add((TKey)(object)t.Key, t.Value.Title);
}
}
return ret;
}
public static List GetItemKeyList() where T : struct
{
List list = new List();
Array array = typeof(T).GetEnumValues();
foreach (object t in array)
{
list.Add((T)t);
}
return list;
}
public static Dictionary GetItemAttributeList() where T : struct
{
if (!typeof(T).IsEnum)
{
throw new Exception("参数必须是枚举!");
}
Dictionary ret = new Dictionary();
Array array = typeof(T).GetEnumValues();
foreach (object t in array)
{
EnumTitleAttribute att = GetEnumTitleAttribute(t as Enum);
if (att != null)
ret.Add((T)t, att);
}
return ret;
}
///
/// 获取枚举所有项的标题,其文本是由应用在枚举值上的EnumTitleAttribute设定
///
/// 枚举类型
/// 是否生成“全部”项
/// 语言
///
public static Dictionary GetAllItemValueList() where T : struct
{
return GetItemValueList(true);
}
///
/// 获取一个枚举的键值对形式
///
/// 枚举类型
/// 排除的枚举
///
public static Dictionary GetEnumDictionary(IEnumerable exceptTypes = null) where TEnum : struct
{
var dic = GetItemList();
Dictionary dicNew = new Dictionary();
foreach (var d in dic)
{
if (exceptTypes != null && exceptTypes.Contains(d.Key))
{
continue;
}
dicNew.Add(d.Key.GetHashCode(), d.Value);
}
return dicNew;
}
}
public class EnumTitleAttribute : Attribute
{
private bool _IsDisplay = true;
public EnumTitleAttribute(string title, params string[] synonyms)
{
Title = title;
Synonyms = synonyms;
Order = int.MaxValue;
}
public bool IsDisplay { get { return _IsDisplay; } set { _IsDisplay = value; } }
public string Title { get; set; }
public string Description { get; set; }
public string Letter { get; set; }
///
/// 近义词
///
public string[] Synonyms { get; set; }
public int Category { get; set; }
public int Order { get; set; }
}
}