簡體   English   中英

C#擴展所有[Flag]枚舉?

[英]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類-特別是OrHasAnyHasAll方法。

不,您不能,因為沒有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.

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