如何获取C#带[Flags]特性的枚举组合值的所有底层枚举项?
获取Flags枚举组合值中的所有底层枚举成员
针对你给出的PhoneService枚举,要提取All组合值里的所有底层成员,有几种简单的实现方式:
方法一:使用HasFlag方法遍历判断
利用Enum.GetValues获取枚举的所有成员,再通过HasFlag检查组合值是否包含该成员,注意排除None(因为0和任何值按位与结果都是0,会被误判):
[Flags] public enum PhoneService { None = 0, LandLine = 1, Cell = 2, Fax = 4, Internet = 8, All = LandLine | Cell | Fax | Internet } public static IEnumerable<PhoneService> GetFlagMembers(PhoneService combinedValue) { foreach (PhoneService service in Enum.GetValues(typeof(PhoneService))) { if (service != PhoneService.None && combinedValue.HasFlag(service)) { yield return service; } } } // 使用示例 var allServices = GetFlagMembers(PhoneService.All); foreach (var service in allServices) { Console.WriteLine(service); // 输出:LandLine、Cell、Fax、Internet }
方法二:手动按位运算判断
如果不想用HasFlag,可以直接通过按位与运算来判断组合值是否包含某个成员:
public static IEnumerable<PhoneService> GetFlagMembersManual(PhoneService combinedValue) { foreach (PhoneService service in Enum.GetValues(typeof(PhoneService))) { if (service != PhoneService.None && (combinedValue & service) == service) { yield return service; } } }
如果需要底层数值
要是你需要的是成员对应的数值(比如1、2、4、8),只需把枚举成员转换成int类型即可:
var serviceValues = GetFlagMembers(PhoneService.All).Select(s => (int)s); // serviceValues 结果为 {1, 2, 4, 8}
内容的提问来源于stack exchange,提问作者Anoop
相关产品推荐
相关产品推荐

