C# 长位掩码中的枚举值列表

C# 长位掩码中的枚举值列表,c#,enums,bitmask,C#,Enums,Bitmask,我们有一个通过位掩码保护api控制器操作的应用程序。我要做的是根据位掩码值获取枚举列表 以下是一个示例枚举: [Flags] public enum DriverChange : long { CanAccess = 1 << 0, CanView = 1 << 1, CanUpdate = 1 << 2, MayPerformBaseFunctions = 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,

    }
我想做的是根据整数值获取
值的列表

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

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

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

我不能改变。这就是现有的代码。它被定义为int,因为它表示赋值的二进制和。??你可以直接投。无论如何,听起来您最终将不得不更改它,因为基础枚举是一个
长的
,并且您的int值不足以包含它们。
var permissionDetails = Enum.GetValues(typeof(DriverDataChange)).Cast<DriverDataChange>()
                             .Where(m => DriverDataChangeData.View.HasFlag(m));
var permissionDetails = Enum.GetValues(typeof(DriverDataChange)).Cast<DriverDataChange>()
                   .Where(m => ((DriverDataChange)DriverDataChangeData.View).HasFlag(m));