在枚举值中查找最高设置标志

Phi*_*per 8 .net c# enums

我正在使用带有flags属性的枚举作为跟踪状态的方法.

一个例子如下:

Created = 1
Completed = 2
Dispatched = 4
Run Code Online (Sandbox Code Playgroud)

没有写太严格的东西(如果检查这个,那么,如果检查,执行此操作)我希望能够找到已设置的最高标志,在此示例中:

Item.Status = Status.Created | Status.Completed
Run Code Online (Sandbox Code Playgroud)

神秘的方法将返回2 - 完成后设置的值最高的标志.

GetMaxSetFlagValue(Item.Status) // returns 2
Run Code Online (Sandbox Code Playgroud)

我发现了围绕实际枚举的问题,而不是使用标志的值.我很确定这可以用Linq实现......?

DeC*_*Caf 9

像下面这样的东西应该工作:

static int GetMaxSetFlagValue<T>(T flags) where T : struct
{
   int value = (int)Convert.ChangeType(flags, typeof(int));
   IEnumerable<int> setValues = Enum.GetValues(flags.GetType()).Cast<int>().Where(f => (f & value) == f);
   return setValues.Any() ? setValues.Max() : 0;
}
Run Code Online (Sandbox Code Playgroud)

如果T不是枚举类型,则该方法将失败,因此最好在方法的开头执行检查.它也不适用于底层类型大于int(即long)的枚举.