2016-11-16 4 views
1

У нас есть приложение, которое защищает действия контроллера api с помощью битовой маски. То, что я пытаюсь сделать, это получить список перечислений на основе значения битовой маски.Список значений Enum из длинной битовой маски

Вот пример Enum:

[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

Ваша проблема заключается в том, что вы определили данные в 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)); 

Который возвращает:

CanAccess
CanView
MayPerformBaseFunctions

Edit:

Если вы имеют сохранить значения DriverDataChange в int, то вы можете бросить их в чеке:

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

Я не могу изменить. Это существующий код. Он определяется как int, поскольку он представляет двоичную сумму назначенных значений. – JDBennett

+0

?? Вы могли бы просто бросить их. Во всяком случае, похоже, что в конечном итоге вам придется изменить его, поскольку базовое перечисление является «длинным», а ваши значения int не будут достаточно большими, чтобы их содержать. – stuartd

Смежные вопросы