分解一个枚举类型变量包含的多个枚举值

来源:互联网 发布:mysql where or 效率 编辑:程序博客网 时间:2024/06/05 14:12

目标:分解一个枚举类型变量包含的多个枚举值

如:

Langs langJava = Langs.Csharp | Langs.Python;

解决办法:

关键点在于枚举定义时需加[System.Flags]特性标记

枚举定义:

[System.Flags]enum Langs { Csharp = 1, Java = 2, Python = 4, Lisp = 16 };

分解函数:

        /// <summary>        /// 分解枚举类型值,允许一个枚举实例被辅多个值,该枚举类型必须[System.Flags]标记        /// </summary>        /// <param name="item">枚举</param>        /// <returns>包含的多个枚举值集合</returns>        public IEnumerable<Enum> GetValueFromEnumInstance(Enum item)        {            Dictionary<string, Enum> values = new Dictionary<string, Enum>();            foreach (Enum value in Enum.GetValues(item.GetType()))            {                values.Add(value.ToString(), value);            }            List<string> itemNames = item.ToString().Split(',').ToList<string>();            List<Enum> result = new List<Enum>();            foreach (var enumItem in values)            {                string itemName = itemNames.FirstOrDefault<string>(x => x.Trim().Equals(enumItem.Key.Trim()));                if (!string.IsNullOrEmpty(itemName))                {                    result.Add(enumItem.Value);                    itemNames.Remove(itemName);                }            }            return result.Distinct<Enum>();        }

调用例子:

            Langs langJava = Langs.Csharp | Langs.Python;                        Console.WriteLine(string.Format("first:{0}",langJava));            foreach (var name in GetValueFromEnumInstance(langJava))                Console.WriteLine("name : " + name);



0 0