繁体   English   中英

使用Enum.HasFlag()检查UInt16是否有标志?

[英]Checking UInt16 for flags using Enum.HasFlag()?

我有一个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()做到这一点,还是应该只实现按位操作并完成它?

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

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

Fields value = (Fields) (int) incomingValue;

编辑:如注释中所述,此检查不会执行您想要的操作:

if (value.HasFlag(Fields.None))

文档中

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

基本上你想要:

if (value == 0)

代替该测试。

也许您想要UInt16类型的枚举?

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

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

问题在于,在您的第一个if中,您将您的值与0进行比较。HasFlag使用value的按位与和以及所传递的enum和bitwise以及任何值与0的结果为0的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM