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

 2023-09-05 阅读 441 评论 0

摘要:枚举类型是定义了一组“符号名称/值”配对。枚举类型是强类型的。每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueType又从system.Object派生,所以枚举类型是指类型。 编译枚举类型时,C#编译器会把每个符号转换成类

   枚举类型是定义了一组“符号名称/值”配对。枚举类型是强类型的。每个枚举类型都是从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 = 1; 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 == -100) 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 == -1) 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 < 0 || index > dic.Count)return ret;var i = 0;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 = -1;if (string.IsNullOrEmpty(name))return ret;var dic = GetEnumList(enumType);foreach (var item in dic){if (string.Compare(item.Value, name, StringComparison.Ordinal) != 0) 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 = 1; 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 != 1) continue;var attr = (EnumTextAttribute)attrs[0];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 = -1;if (string.IsNullOrEmpty(name))return ret;var dic = GetEnumList(enumType);var i = 0;foreach (var item in dic){if (string.Compare(item.Value, name, StringComparison.Ordinal) == 0){ret = i;break;}i++;}return ret;}

 

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/966.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息