簡體   English   中英

應該“或”與 .Net4 Hasflags 一起使用: enum.HasFlag(AccessRights.Read | AccessRights.Write)

[英]Should "or" work with .Net4 Hasflags: enum.HasFlag(AccessRights.Read | AccessRights.Write)

我正在嘗試新的 HasFlags 功能,並想知道以下是否可行:

enum.HasFlag(AccessRights.Read | AccessRights.Write)

......因為它似乎沒有......

 DBAccessRights rights = (DBAccessRights)permission.PermissionFlags;
  if (rights.HasFlag(DBAccessRights.WikiMode))
  {
     // works
  }


  if (rights.HasFlag(DBAccessRights.WikiMode | DBAccessRights.CreateNew))
  {
     // Doesn't work    
  }

  DBAccessRights flags = DBAccessRights.WikiMode | DBAccessRights.CreateNew;
  if (rights.HasFlag(flags))
  {
     // Doesn't work
  }

給定文檔 ,如果該值同時具有這兩個標志,則我希望它返回true。

如果你把它想測試你的值是否有任何的標志,你需要

value.HasFlag(AccessRights.Read) | value.HasFlag(AccessRights.Write)

如果您對它的可讀性不夠好,則可能要看一下我的“ 不受約束的旋律”項目。 碰巧它已經具有您想要的功能(作為Flags.cs擴展方法):

// Same as value.HasFlag(AccessRights.Read | AccessRights.Write)
value.HasAll(AccessRights.Read | AccessRights.Write)

// Same as value.HasFlag(AccessRights.Read) | value.HasFlag(AccessRights.Write)
value.HasAny(AccessRights.Read | AccessRights.Write)

國際海事組織,這將使情況更清楚。 他們還將避免裝箱,並保持類型安全:)

MSDN

HasFlag方法返回以下布爾表達式的結果。

thisInstance和flag =標志

對於復雜的標志,例如AccessRights.Read | AccessRights.Write AccessRights.Read | AccessRights.Write ,這將檢查是否存在所有 “包含”標志。

您可能要檢查是否存在任何標志,在這種情況下,您可以執行以下操作:

myAccessRights & (AccessRights.Read | AccessRights.Write) != 0 

| 運算符是按位或。 這意味着如果Read為1且Write為2,則值Read | Write Read | Write為3(請參見其二進制表示形式)。 因此,僅當您的enum變量同時設置 ReadWrite HasFlag返回true。

另外,您可以顛倒表達式的順序:

//returns true - a bit easier on the eye
(AccessRights.Read | AccessRights.Write).HasFlag(myAccessRights)

如果您具有讀取” |“返回”,它將返回true。 寫訪問。 這在功能上將等效於:

//also returns true - as per @Ani's answer
myAccessRights & (AccessRights.Read | AccessRights.Write) != 0

編輯

如注釋中所指出的,如果myAccessRights為空,則第一個表達式將返回true;如果myAccessRights不僅僅是Read和Write,則第一個表達式將返回false。

在標記的枚舉中,您可以簡單地執行以下操作:

(MyEnum01 & MyEnum02) != 0

如果有任何公共位,則將設置一個位,因此該數字不再為 0。如果沒有公共位,則結果為 0。為此,標記為 0 的枚舉應表示“無”。

這是通用枚舉的靜態方法和特定枚舉的靜態方法:

public static partial class UtilityMethods
{
    public static bool HasAnyFlags (Enum enumA, Enum enumB)
    {
        return ((int) (object) enumA & (int) (object) enumB) != 0;
    }

    public static bool HasAnyFlags (MyEnum enumA, MyEnum enumB)
    {
        return (enumA & enumB) != 0;
    }
}

您還可以創建自己的擴展方法:

public static partial class ExtensionMethods
{
    public static bool HasAnyFlag (this Enum e, Enum compared)
    {
        return ((int) (object) e & (int) (object) compared) != 0;
    }
}

對於通用枚舉,我從這里進行了轉換。 據稱,使用 boxing 而不是Converter.ToInt32()來執行它的性能更高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM