Edit:
Самый простой и приятный вариант - перейти на VS2010 Beta2 и использовать Enum.HasFlag . Команда разработчиков фреймворков добавила в Enum множество приятных дополнений, чтобы их было удобнее использовать.
Оригинал (для текущего .NET):
Вы можете сделать это, передав Enum вместо generics:
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 в рутину. Вы должны использовать это разумно.