[英]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
變量同時設置了 Read
和Write
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.