[英]Is there a solution for a bitwise logical AND (&) operator between two Enum values in C#
考慮 C# 中的以下簡單標志枚舉:
[Flags]
public enum CountingEnum
{
Zero = 0,
One = 1 << 0,
Two = 1 << 1,
Three = Two | One,
Four = 1 << 2,
Five = Four | One,
}
如果我想知道一個值是否包含另一個值,我可以使用按位邏輯 AND (&) 運算符編寫一個簡單的擴展方法。 這看起來很像 Enum.HasFlag,但我寫出來是有原因的。 此方法需要知道 Enum 類型,而 HasFlag 僅適用於匹配的枚舉類型。 我想要一個跨類型的通用解決方案:
public static class CountingEnumExtensions
{
public static bool Contains(this CountingEnum value, CountingEnum target)
{
return (value & target) == target;
}
}
這有助於使用一種簡潔的語法來檢查一個標志值是否包含另一個:
if (CountingEnum.Five.Contains(CountingEnum.Four))
{
// Yep!
}
if (CountingEnum.Four.Contains(CountingEnum.Five))
{
// Nope!
}
但是,如果我有另一個 Flags Enum 怎么辦? 每次我想這樣做時,我都可以制作另一種擴展方法,但這不是很可持續。 .HasFlag 也無濟於事:
if (CountingEnum.Three.HasFlag(AnotherCountingEnum.One){
// System.ArgumentException
}
我可以在任何地方手動使用它,但它對於按位不識字的人來說不是很可讀:
if ((SomeEnum.Value & SomeEnum.Target) == SomeEnum.Target)
{
// Dunno!
}
但是有沒有通用的解決方案? 當然,以下內容不會編譯,但它傳達了我想要的想法:
public static class EnumExtensions
{
public static bool Contains(this Enum value, Enum target)
{
// Cannot apply operation '&' to operands of
// type 'System.Enum' and 'System.Enum'
return (value & target) == target;
}
}
是否有針對任何兩個匹配類型的標志枚舉值執行按位邏輯與的通用解決方案?
如果它們的符號不重要,可以嘗試無符號整數類型轉換。
public static bool Contains(this Enum value, Enum target)
{
uint y = Convert.ToUInt32(value);
uint z = Convert.ToUInt32(target)
return (y & z) == z;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.