You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:00:15