[英]How to know if enum has all flags
我試圖知道枚舉值是否定義了所有標志。 枚舉定義如下:
[Flags]
public enum ProgrammingSkills
{
None = 0,
CSharp = 1,
VBNet = 2,
Java = 4,
C = 8,
}
我無法更改枚舉以定義“全部”,因為該枚舉是在dll庫中定義的。
當然我可以迭代所有枚舉值,但有沒有更好/更短/更聰明的方法來確定枚舉值是否定義了所有值?
編輯:
我希望工作代碼甚至枚舉更改。
我不知道它是否更好,但它肯定更短,如果您將來修改enum
,它將起作用:
bool result = Enum.GetValues(typeof(ProgrammingSkills))
.Cast<ProgrammingSkills>()
.All(enumValue.HasFlag);
您可以執行以下操作:
var hasAll = val == (ProgrammingSkills.CSharp | ProgrammingSkills.VBNet
| ProgrammingSkills.Java | ProgrammingSkills.C);
或更短,但不太適合維護:
var hasAll = (int)val == 15; // 15 = 1 + 2 + 4 + 8
或以通用方式:
var hasAll = (int)val == Enum.GetValues(typeof(ProgrammingSkills))
.OfType<ProgrammingSkills>().Sum(v => (int)v);
ProgrammingSkills ps = ProgrammingSkills.None | ProgrammingSkills.CSharp | ProgrammingSkills.VBNet | ProgrammingSkills.Java | ProgrammingSkills.C;
int total = (int)ps;
if (total == 15) return true;//ALL FLAGS THERE
您可以測試所有成員:
bool allSet = value & (ProgrammingSkills.CSharp
| ProgrammingSkills.VBNet
| ProgrammingSkills.Java
| ProgrammingSkills.C) != 0;
|
創建一個包含所有可能值的掩碼,該值根據value
進行測試( &
),包含要測試的枚舉。
但這很容易出錯並且無法維護。 你可能想要堅持循環。
您可以將枚舉轉換為int
並檢查值是否為15(所有枚舉標志的總和):
ProgrammingSkills programmingSkills = ProgrammingSkills.CSharp | ProgrammingSkills.VBNet | ProgrammingSkills.Java | ProgrammingSkills.C;
int programmingSkillsValue = (int)programmingSkills;
if(programmingSkillsValue == 15)
{
// All Flags are set
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.