[英]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.