c# - 是否可以创建通用的按位枚举 'IsOptionSet()' 方法?

标签 c# .net enums bit-manipulation

下面的代码可以很容易地传入一组 HtmlParserOptions,然后检查单个选项是否已被选中。

[Flags]
public enum HtmlParserOptions
{
    NotifyOpeningTags = 1,
    NotifyClosingTags = 2,
    NotifyText = 4,
    NotifyEmptyText = 8
}

private bool IsOptionSet(HtmlParserOptions options, HtmlParserOptions singleOption)
{
    return (options & singleOption) == singleOption;
}

我的问题是,是否可以创建一个通用版本(我猜测是通过在方法属性上实现一个接口(interface))来使用带有 Flags 属性的任何枚举?

最佳答案

编辑:

最简单、最好的选择是升级到 VS2010 Beta2 并使用 .NET 4 的 Enum.HasFlag方法。框架团队为 Enum 添加了很多不错的附加功能,使它们更易于使用。


原始(针对当前的 .NET):

您可以通过传递枚举而不是泛型来做到这一点:

static class EnumExtensions
{
    private static bool IsSignedTypeCode(TypeCode code)
    {
        switch (code)
        {
            case TypeCode.Byte:
            case TypeCode.UInt16:
            case TypeCode.UInt32:
            case TypeCode.UInt64:
                return false;
            default:
                return true;
        }
    }

    public static bool IsOptionSet(this Enum value, Enum option)
    {
        if (IsSignedTypeCode(value.GetTypeCode()))
        {
            long longVal = Convert.ToInt64(value);
            long longOpt = Convert.ToInt64(option);
            return (longVal & longOpt) == longOpt;
        }
        else
        {
            ulong longVal = Convert.ToUInt64(value);
            ulong longOpt = Convert.ToUInt64(option);
            return (longVal & longOpt) == longOpt;
        }
    }
}

这很完美,就像这样:

class Program
{
    static void Main(string[] args)
    {
        HtmlParserOptions opt1 = HtmlParserOptions.NotifyText | HtmlParserOptions.NotifyEmptyText;
        Console.WriteLine("Text: {0}", opt1.IsOptionSet(HtmlParserOptions.NotifyText));
        Console.WriteLine("OpeningTags: {0}", opt1.IsOptionSet(HtmlParserOptions.NotifyOpeningTags));

        Console.ReadKey();
    } 
}

上面的打印:

Text: True
OpeningTags: False

不过,这样做的缺点是它不能防止您将两种不同类型的 Enum 类型传递到例程中。你必须合理地使用它。

关于c# - 是否可以创建通用的按位枚举 'IsOptionSet()' 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1614412/

相关文章:

C# 在调用堆栈中捕获未处理的异常

没有 Windows dll 的 C# 和 HID

c# - 无法强制 WebBrowser 控件使用当前版本的 IE 呈现

c# - Visual Studio 和 .NET 中的条件文件编译

java - Java 标准库中是否有某种方法可以从一组枚举中获取最小的枚举?

java - 从枚举填充 Swing JComboBox

java - 如何从 Java 中的 Enum 值返回具有所有属性的 Enum 对象

c# - 对特殊组进行分组和过滤的 LINQ 查询

c# - 使用 .net SDK 暂停和启动 Azure 分析服务

c# LINQ 加入以逗号分隔的字符串