【问题标题】:List of Enum values from long bit mask长位掩码中的枚举值列表
【发布时间】:2016-11-16 18:01:40
【问题描述】:

我们有一个通过位掩码保护 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);
    }

我想做的是根据整数值获取&lt;T&gt; 值的列表。

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

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

【问题讨论】:

    标签: c# enums bitmask


    【解决方案1】:

    您的问题是您将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));
    

    返回:

    可以访问
    可以查看
    MayPerformBaseFunctions

    编辑:

    如果您必须DriverDataChange 的值保留为int,那么您可以将它们投射到支票中:

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

    【讨论】:

    • 我无法改变这一点。那是现有的代码。它被定义为 int,因为它表示赋值的二进制和。
    • ??你可以直接施放它们。无论如何,听起来您最终将不得不更改它,因为底层枚举是 long 并且您的 int 值不足以容纳它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多