下面的代码可以很容易地传入一组 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/