C#枚举 - 检查面具上的标志

Tom*_*zzo 7 .net c# enums flags enum-flags

我有以下枚举标志:

[Flags]
private enum MemoryProtection: uint
{
    None             = 0x000,
    NoAccess         = 0x001,
    ReadOnly         = 0x002,
    ReadWrite        = 0x004,
    WriteCopy        = 0x008,
    Execute          = 0x010,
    ExecuteRead      = 0x020,
    ExecuteReadWrite = 0x040,
    ExecuteWriteCopy = 0x080,
    Guard            = 0x100,
    NoCache          = 0x200,
    WriteCombine     = 0x400,
    Readable         = (ReadOnly | ReadWrite | ExecuteRead | ExecuteReadWrite),
    Writable         = (ReadWrite | WriteCopy | ExecuteReadWrite | ExecuteWriteCopy)
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个枚举实例,我需要检查它是否可读.如果我使用以下代码:

myMemoryProtection.HasFlag(MemoryProtection.Readable)
Run Code Online (Sandbox Code Playgroud)

它总是在我的情况下返回false,因为我认为HasFlag检查它是否有每个标志.我需要优雅的东西来避免这样做:

myMemoryProtection.HasFlag(MemoryProtection.ReadOnly)         ||
myMemoryProtection.HasFlag(MemoryProtection.ReadWrite)        ||
myMemoryProtection.HasFlag(MemoryProtection.ExecuteRead)      ||
myMemoryProtection.HasFlag(MemoryProtection.ExecuteReadWrite)
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

das*_*ght 8

您可以转动条件,检查复合enum是否有标志,而不是检查复合的标志,如下所示:

if (MemoryProtection.Readable.HasFlag(myMemoryProtection)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

MemoryProtection a = MemoryProtection.ExecuteRead;
if (MemoryProtection.Readable.HasFlag(a)) {
    Console.WriteLine("Readable");
}
if (MemoryProtection.Writable.HasFlag(a)) {
    Console.WriteLine("Writable");
}
Run Code Online (Sandbox Code Playgroud)

这打印Readable.