[英]C# Extending all [Flag] enums?
public static bool Get(this EventFlags flags, EventFlags flag)
{
return ((flags & flag) != 0);
}
public static void Set(this EventFlags flags, EventFlags flag, bool value)
{
if (value)
flags |= flag;
else
flags &= ~flag;
}
基本上我想對任何[Flag]枚舉執行此操作
[Flags]
public enum FlagEn
{
None = 0x0000,
UseSkill = 0x0001
}
您真正想要的是具有枚舉約束的通用方法。 但是,C#不允許這樣做。
幸運的是,CLR 確實允許這樣做,並且有一點點黑客,您可以使用一個庫來獲得類似的好處-盡管我應該指出您的Set
方法當前實際上並未執行任何操作-您應該使它真正在返回之后返回值計算它。
我有一個圖書館,您可能想看看這類事情: Unconstrained Melody 。 請注意,即使使用了駭客工具,約束也無法在編譯時強制執行,因為您實際上是在標志枚舉而不是其他枚舉上調用它。 (盡管我確實提供執行時間檢查。)
對於您要執行的操作,建議您查看Flags
類-特別是Or
, HasAny
和HasAll
方法。
不,您不能,因為沒有FlagEnum
類的東西,只有具有Flag
屬性的enum
。
您可以嘗試以下方法:
public static class EnumExtensions
{
public static bool Get(this Enum theEnum, Enum flag)
{
var flagsAttributes = theEnum.GetType().GetCustomAttributes(typeof(FlagsAttribute), false);
if (flagsAttributes.Length == 0)
return false; // not a [Flags] enum
return theEnum.HasFlag(flag);
}
}
您可以考慮退還bool?
而是當enum
不具有[Flags]
屬性時返回null
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.