繁体   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