来自长位掩码的枚举值列表
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 );
我们有一个应用程序可以通过位掩码保护 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 );