編輯:
最簡單,最好的選擇是升級到Beta2的VS2010和使用.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
不過,它的缺點是它並不能保護您將兩種不同類型的枚舉類型傳入例程。你必須合理地使用它。
你可以切換到德爾福 - 這個功能是內置的:) – Ray 2009-10-23 16:07:04
早在那天我就用Delphi了:)有趣的是,Delphi的創建者是微軟帶來創建C#的人 - 所以它是恥辱,他放棄了功能 – 2009-10-26 09:33:55
@射線它回到了4.0! – 2012-06-20 17:50:39