C#枚举类型的常用操作总结

时间:2023-12-24 16:58:37

枚举类型是定义了一组“符号名称/值”配对。枚举类型是强类型的。每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueType又从system.Object派生,所以枚举类型是指类型。

编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段。C#编译器将枚举类型视为基元类型。

1.获取枚举列表:

        /// <summary>
/// 获取枚举列表
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <returns>枚举列表</returns>
public static Dictionary<int, string> GetEnumList(Type enumType)
{
var dic = new Dictionary<int, string>();
try
{
var fd = enumType.GetFields();
for (var index = ; index < fd.Length; ++index)
{
var info = fd[index];
var fieldValue = System.Enum.Parse(enumType, fd[index].Name);
var attrs = info.GetCustomAttributes(typeof(EnumTextAttribute), false);
foreach (EnumTextAttribute attr in attrs)
{
var key = (int)fieldValue;
if (key == -) continue;
var value = attr.Text;
dic.Add(key, value);
}
}
return dic;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

2.获取枚举名称:

        /// <summary>
/// 获取枚举名称
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="id">枚举值</param>
/// <returns>如果枚举值存在,返回对应的枚举名称,否则,返回空字符</returns>
public static string GetEnumTextById(Type enumType, int id)
{
var ret = string.Empty;
try
{
var dic = GetEnumList(enumType);
foreach (var item in dic)
{
if (item.Key != id) continue;
ret = item.Value;
break;
}
return ret;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

3.根据枚举值获取对应中文描述:

        /// <summary>
/// 根据枚举值获取对应中文描述
/// </summary>
/// <param name="enumValue">枚举值</param>
/// <returns>枚举值中文描述</returns>
public static string GetEnumTextByEnum(object enumValue)
{
var ret = string.Empty;
if ((int)enumValue == -) return ret;
try
{
var dic = GetEnumList(enumValue.GetType());
foreach (var item in dic)
{
if (item.Key != (int)enumValue) continue;
ret = item.Value;
break;
}
return ret;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

4.获取枚举名称:

        /// <summary>
/// 获取枚举名称
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="index">枚举值的位置编号</param>
/// <returns>如果枚举值存在,返回对应的枚举名称,否则,返回空字符</returns>
public static string GetEnumTextByIndex(Type enumType, int index)
{
var ret = string.Empty;
var dic = GetEnumList(enumType);
if (index < || index > dic.Count)
return ret;
var i = ;
foreach (var item in dic)
{
if (i == index)
{
ret = item.Value;
break;
}
i++;
} return ret;
}

5.获取枚举值:

        /// <summary>
/// 获取枚举值
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="name">枚举名称</param>
/// <returns>如果枚举名称存在,返回对应的枚举值,否则,返回-1</returns>
public static int GetEnumIdByName(Type enumType, string name)
{
var ret = -;
if (string.IsNullOrEmpty(name))
return ret;
var dic = GetEnumList(enumType);
foreach (var item in dic)
{
if (string.Compare(item.Value, name, StringComparison.Ordinal) != ) continue;
ret = item.Key;
break;
}
return ret;
}

6.获取名字对应枚举值:

        /// <summary>
/// 获取名字对应枚举值
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="name">枚举名称</param>
/// <returns></returns>
public static T GetEnumIdByName<T>(string name) where T : new()
{
var type = typeof(T); var enumItem = (T)TypeDescriptor.GetConverter(type).ConvertFrom("-1");
if (string.IsNullOrEmpty(name))
return enumItem; try
{
var fd = typeof(T).GetFields();
for (var index = ; index < fd.Length; ++index)
{
var info = fd[index];
var fieldValue = System.Enum.Parse(type, fd[index].Name);
var attrs = info.GetCustomAttributes(typeof(EnumTextAttribute), false);
if (attrs.Length != ) continue;
var attr = (EnumTextAttribute)attrs[];
if (!name.Equals(attr.Text)) continue;
enumItem = (T)fieldValue;
break;
}
return enumItem;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

7.获取枚举值所在的位置编号:

        /// <summary>
/// 获取枚举值所在的位置编号
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="name">枚举名称</param>
/// <returns>如果枚举名称存在,返回对应的枚举值的位置编号,否则,返回-1</returns>
public static int GetEnumIndexByName(Type enumType, string name)
{
var ret = -; if (string.IsNullOrEmpty(name))
return ret; var dic = GetEnumList(enumType);
var i = ;
foreach (var item in dic)
{
if (string.Compare(item.Value, name, StringComparison.Ordinal) == )
{
ret = i;
break;
}
i++;
} return ret;
}