我有一个 C#/.NET 4.0 应用程序,它接收和解析来自网络连接的一些数据。我需要解析的一个特定数据是表示一组标志的 UInt16 值。我已经定义了一个表示这些标志的枚举,如下所示:
public enum Fields
{
None = 0,
FirstFlag = 1,
SecondFlag = 2,
ThirdFlag = 4,
FourthFlag = 8,
FifthFlag = 16,
SixthFlag = 32,
SeventhFlag = 64,
EighthFlag = 128
}
我将尝试对这个 UInt16 值使用按位运算符来确定它指示的哪些标志已设置。但后来我遇到了 Enum.HasFlag() 方法,乍一看,这似乎比按位运算更容易。我一直在尝试使用以下方法来确定在 UInt16 值中设置了哪些标志:
public static void CheckForSetFields(Fields value)
{
if (value.HasFlag(Fields.None))
{
System.Diagnostics.Debug.WriteLine("No fields are set!");
}
else
{
if (value.HasFlag(Fields.FirstFlag))
{
System.Diagnostics.Debug.WriteLine("First flag is set.");
}
if (value.HasFlag(Fields.SecondFlag))
{
System.Diagnostics.Debug.WriteLine("Second flag is set.");
}
// etc., etc.
if (value.HasFlag(Fields.EighthFlag))
{
System.Diagnostics.Debug.WriteLine("Eighth flag is set.");
}
}
}
此方法显然采用 Fields 类型的参数(我的枚举),但我正在使用发送给我的 UInt16 值。我假设我需要将 UInt16 转换为 Fields 枚举的实例,但我不知道该怎么做。它似乎不像只是投射它那么简单(这不会给我一个错误,但也不会返回预期的结果)。是否可以使用 Enum.HasFlag() 来做到这一点,或者我应该只实现按位运算并完成它?