目标:分解一个枚举类型变量包含的多个枚举值
如:
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);