0

我有一个 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() 来做到这一点,或者我应该只实现按位运算并完成它?

4

3 回答 3

3

我假设我需要将 UInt16 转换为 Fields 枚举的实例,但我不知道该怎么做。

这很容易 - 您需要转换为枚举的基础类型,然后您可以转换为枚举本身:

Fields value = (Fields) (int) incomingValue;

编辑:如评论中所述,此检查不符合您的要求:

if (value.HasFlag(Fields.None))

文档中:

如果flag的基础值为零,则该方法返回true

基本上你想要:

if (value == 0)

代替该测试。

于 2014-09-04T18:55:48.610 回答
1

也许你想要一个 UInt16 类型的枚举?

使用声明您的枚举,enum SomeFlag : UInt16 { }然后将您的值直接转换为枚举,使用(SomeFlag)someValue, 将起作用。

[Flags]向标志枚举添加属性是一个好习惯。它实际上并没有做任何事情,但您可以告诉自己和其他查看者这是一个标志,并且调试器将在监视面板中显示组合标志而不是数值。

于 2014-09-04T19:23:02.727 回答
0

问题是,在你的第一个 if 中,你将你的值与 0 进行比较。 HasFlag 使用按位和值以及传递的枚举和按位和任何值的结果,0 是 0。所以你不会得到其他条件。

于 2014-09-04T19:15:09.217 回答