我正在使用带有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实现......?
像下面这样的东西应该工作:
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
)的枚举.
归档时间: |
|
查看次数: |
2351 次 |
最近记录: |