У нас есть приложение, которое защищает действия контроллера 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>();
Я не могу изменить. Это существующий код. Он определяется как int, поскольку он представляет двоичную сумму назначенных значений. – JDBennett
?? Вы могли бы просто бросить их. Во всяком случае, похоже, что в конечном итоге вам придется изменить его, поскольку базовое перечисление является «длинным», а ваши значения int не будут достаточно большими, чтобы их содержать. – stuartd