gpt4 book ai didi

C# 枚举 - 根据掩码检查标志

转载 作者:太空狗 更新时间:2023-10-29 19:59:54 26 4
gpt4 key购买 nike

我有以下枚举标志:

[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)
}

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

myMemoryProtection.HasFlag(MemoryProtection.Readable)

在我的例子中它总是返回 false,因为我认为 HasFlag 检查它是否有每个标志。我需要一些优雅的东西来避免这样做:

myMemoryProtection.HasFlag(MemoryProtection.ReadOnly)         ||
myMemoryProtection.HasFlag(MemoryProtection.ReadWrite) ||
myMemoryProtection.HasFlag(MemoryProtection.ExecuteRead) ||
myMemoryProtection.HasFlag(MemoryProtection.ExecuteReadWrite)

我该怎么做?

最佳答案

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

if (MemoryProtection.Readable.HasFlag(myMemoryProtection)) {
...
}

这是一个例子:

MemoryProtection a = MemoryProtection.ExecuteRead;
if (MemoryProtection.Readable.HasFlag(a)) {
Console.WriteLine("Readable");
}
if (MemoryProtection.Writable.HasFlag(a)) {
Console.WriteLine("Writable");
}

这会打印Readable

关于C# 枚举 - 根据掩码检查标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16204519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com