8

次の列挙フラグがあります。

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

HasFlag はすべてのフラグがあるかどうかをチェックすると思うので、私の場合は常に false を返します。これを避けるためにエレガントなものが必要です:

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

どうすればいいですか?

4

3 に答える 3

9

次のように、条件を変えて、コンポジット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ます。

于 2013-04-25T00:41:29.533 に答える
4

はい、hasFlagすべてのビット フィールド (フラグ) が設定されているかどうかを確認します。

Readable名前に含まれるすべての保護の複合体として扱うのではなく、構成Readを好転させることはできますか? 例えば

[Flags]
private enum MemoryProtection: uint
{
    NoAccess         = 0x000,
    Read             = 0x001,
    Write            = 0x002,
    Execute          = 0x004,
    Copy             = 0x008,
    Guard            = 0x010,
    NoCache          = 0x020,
    ReadOnly         = Read,
    ReadWrite        = (Read | Write),
    WriteCopy        = (Write | Copy),
    // etc.
    NoAccess         = 0x800
}

次に、次のようなコードを記述できます。

myMemoryProtection.HasFlag(MemoryProtection.Read)
于 2013-04-25T00:53:10.393 に答える
4

ビット演算子を試してください:

[TestMethod]
public void FlagsTest()
{
    MemoryProtection mp = MemoryProtection.ReadOnly | MemoryProtection.ReadWrite | MemoryProtection.ExecuteRead | MemoryProtection.ExecuteReadWrite;
    MemoryProtection value = MemoryProtection.Readable | MemoryProtection.Writable;
    Assert.IsTrue((value & mp) == mp);
}
于 2013-04-25T00:41:40.567 に答える