2016-11-16 35 views
1

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

回答

1

你的问题是,你已经在DriverDataChangeint,而不是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)); 

将返回:

CanAccess
CanView
MayPerformBaseFunctions

编辑:

如果保持的DriverDataChange价值为int,那么您可以在检查丢掉。

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

我不能改变的。这是现有的代码。它被定义为一个int,因为它代表了分配值的二进制和。 – JDBennett

+0

??你可以投它们。无论如何,听起来你最终会不得不改变它,因为基础枚举是一个“长”,你的int值将不足以包含它们。 – stuartd