来自长位掩码的枚举值列表

List of Enum values from long bit mask

我们有一个应用程序可以通过位掩码保护 api 控制器操作。我想要做的是根据位掩码值获取枚举列表。

这是一个枚举示例:

    [Flags]
    public enum DriverChange : long
    {
        CanAccess = 1 << 0,
        CanView = 1 << 1,
        CanUpdate = 1 << 2,
        MayPerformBaseFunctions = 1 << 3,
        CanAddPool = 1 << 4,
        CanModifyPool = 1 << 5,

    }

我们通过添加位和存储整数值来创建权限。像这样:

public class DriverDataChange
    {
        public const int None = 0;
        public const int View = (int)(Permissions.DriverDataChange.CanAccess |
                                                Permissions.DriverDataChange.CanView |
                                                Permissions.DriverDataChange.MayPerformBaseFunctions);
        public const int MassUpload = (int)(Permissions.DriverDataChange.CanAccess |
                                                Permissions.DriverDataChange.CanView |
                                                Permissions.DriverDataChange.CanUpdate |
                                                Permissions.DriverDataChange.MayPerformBaseFunctions |
                                                Permissions.DriverDataChange.CanPerformMassUpload);
        public const int FullNoMassUpload = (int)(Permissions.DriverDataChange.CanAccess |
                                                Permissions.DriverDataChange.CanView |
                                                Permissions.DriverDataChange.CanUpdate |
                                                Permissions.DriverDataChange.MayPerformBaseFunctions |
                                                Permissions.DriverDataChange.CanAddPool |
                                                Permissions.DriverDataChange.CanModifyPool |
                                                Permissions.DriverDataChange.CanAddDriver |
                                                Permissions.DriverDataChange.CanModifyDriver |
                                                Permissions.DriverDataChange.CanUnassignVehicle |
                                                Permissions.DriverDataChange.CanCloneVehicleDetails |
                                                Permissions.DriverDataChange.CanModifyVehicleClientDataFields);
        public const int Full = (int)(Permissions.DriverDataChange.CanAccess |
                                                Permissions.DriverDataChange.CanView |
                                                Permissions.DriverDataChange.CanUpdate |
                                                Permissions.DriverDataChange.MayPerformBaseFunctions |
                                                Permissions.DriverDataChange.CanAddPool |
                                                Permissions.DriverDataChange.CanModifyPool |
                                                Permissions.DriverDataChange.CanAddDriver |
                                                Permissions.DriverDataChange.CanModifyDriver |
                                                Permissions.DriverDataChange.CanUnassignVehicle |
                                                Permissions.DriverDataChange.CanCloneVehicleDetails |
                                                Permissions.DriverDataChange.CanModifyVehicleClientDataFields |
                                                Permissions.DriverDataChange.CanPerformMassUpload);
    }

我想做的是根据整数值获取 <T> 值的列表。

我找到了 this,但它不适用于移位值:

List<Permissions.DriverDataChange> permissionDetails =Enum.GetValues(typeof(Permissions.DriverDataChange))
                                                .Cast<Enum>()
                                                .Where(m => DriverDataChange.Full.HasFlag(m))
                                                .Cast<Permissions.DriverDataChange>();

您的问题是您将 DriverDataChange 中的数据定义为 int 而不是 DriverChange

而是像这样定义它们:

public const DriverDataChange View = (DriverDataChange.CanAccess |
                                         DriverDataChange.CanView |
                                         DriverDataChange.MayPerformBaseFunctions);

然后就可以查询了:

var permissionDetails = Enum.GetValues(typeof(DriverDataChange)).Cast<DriverDataChange>()
                             .Where(m => DriverDataChangeData.View.HasFlag(m));

哪个returns:

CanAccess
CanView
MayPerformBaseFunctions

编辑:

如果您DriverDataChange的值保持为int,那么您可以在检查中转换它们:

var permissionDetails = Enum.GetValues(typeof(DriverDataChange)).Cast<DriverDataChange>()
                   .Where(m => ((DriverDataChange)DriverDataChangeData.View).HasFlag(m));

这是我的做法

var permissionDetails = 
            Enum.GetValues(typeof(DriverDataChange))
           .Cast<int>()
           .Where(m => (DriverDataChangeData.View & m) > 0)
           .Cast<DriverDataChange>();

我也写了个扩展

    public static class EnumExtensions
    {
        public static IEnumerable<T> UnfoldBitmask<T>(int bitMask)
        {
            return Enum.GetValues(typeof(T)).Cast<int>().Where(m => (bitMask & m) > 0).Cast<T>();
        }
    }

您可以这样称呼它

int permissionDetails = EnumExtensions.UnfoldBitmask<DriverDataChange>(DriverDataChangeData.View );