【问题标题】:How to work with integer flags如何使用整数标志
【发布时间】:2015-12-29 18:18:35
【问题描述】:

我正在尝试将整数变量设置为 enum 值的组合,enum 是:

public enum WebBrowserDownloadControlFlags : uint
{
    DLIMAGES = 0x00000010,
    VIDEOS = 0x00000020,
    BGSOUNDS = 0x00000040,
    NO_SCRIPTS = 0x00000080,
    NO_JAVA = 0x00000100,
    NO_RUNACTIVEXCTLS = 0x00000200,
    NO_DLACTIVEXCTLS = 0x00000400,
    DOWNLOADONLY = 0x00000800,
    NO_FRAMEDOWNLOAD = 0x00001000,
    RESYNCHRONIZE = 0x00002000,
    PRAGMA_NO_CACHE = 0x00004000,
    NO_BEHAVIORS = 0x00008000,
    NO_METACHARSET = 0x00010000,
    URL_ENCODING_DISABLE_UTF8 = 0x00020000,
    URL_ENCODING_ENABLE_UTF8 = 0x00040000,
    NOFRAMES = 0x00080000,
    FORCEOFFLINE = 0x10000000,
    NO_CLIENTPULL = 0x20000000,
    SILENT = 0x40000000,
    OFFLINEIFNOTCONNECTED = 0x80000000,
    OFFLINE = OFFLINEIFNOTCONNECTED,
}

DownloadControlFlags 是一个整数字段:

    public int DownloadControlFlags
    {
        get
        {
            return _downloadControlFlags;
        }
        set
        {
            if (_downloadControlFlags == value)
                return;

            _downloadControlFlags = value;
            IOleControl ctl = (IOleControl)ActiveXInstance;
            ctl.OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL);
        }
    }

为了设置这个变量,我使用求和作为:

  webBrowser1.DownloadControlFlags = (int)WebBrowserDownloadControlFlags.DLIMAGES
             + (int)WebBrowserDownloadControlFlags.NOFRAMES
             + (int)WebBrowserDownloadControlFlags.NO_FRAMEDOWNLOAD
             + (int)WebBrowserDownloadControlFlags.NO_JAVA
             + (int)WebBrowserDownloadControlFlags.NO_DLACTIVEXCTLS
             + (int)WebBrowserDownloadControlFlags.NO_BEHAVIORS
             + (int)WebBrowserDownloadControlFlags.NO_RUNACTIVEXCTLS
        + (int)WebBrowserDownloadControlFlags.SILENT;

我不确定这是否是正确的方法,但它似乎有效。但现在我想检查变量是否包含特定值。对于普通的enum,解决方案可能是这个问题How to check if any flags of a flag combination are set? 的答案,但我不确定在我的情况下是否可以使用相同的方式。

如何检查是否设置了特定标志?!例如DownloadControlFlags 是否包含WebBrowserDownloadControlFlags.NO_JAVA

【问题讨论】:

  • 您可以将 int 转换为枚举,并检查其上的标志:WebBrowserDownloadControlFlags foo = (WebBrowserDownloadControlFlags)yourInt;

标签: c# enums


【解决方案1】:

对于普通的enum,解决方案可能是这个问题How to check if any flags of a flag combination are set? 的答案,但我不确定在我的情况下是否可以使用相同的方式。

你试过了吗?

int flags = (int)WebBrowserDownloadControlFlags.DLIMAGES
         + (int)WebBrowserDownloadControlFlags.NOFRAMES
         + (int)WebBrowserDownloadControlFlags.NO_FRAMEDOWNLOAD
         + (int)WebBrowserDownloadControlFlags.NO_JAVA
         + (int)WebBrowserDownloadControlFlags.NO_DLACTIVEXCTLS
         + (int)WebBrowserDownloadControlFlags.NO_BEHAVIORS
         + (int)WebBrowserDownloadControlFlags.NO_RUNACTIVEXCTLS
         + (int)WebBrowserDownloadControlFlags.SILENT;

您可以通过将Enum.HasFlag 转换回您的枚举类型来使用它:

Console.WriteLine(((WebBrowserDownloadControlFlags)flags).HasFlag(WebBrowserDownloadControlFlags.NOFRAMES)); // true
Console.WriteLine(((WebBrowserDownloadControlFlags)flags).HasFlag(WebBrowserDownloadControlFlags.VIDEOS)); // false

或者您可以将要比较的枚举标志转换为 int,然后进行逐位比较:

Console.WriteLine((flags & (int)WebBrowserDownloadControlFlags.NO_JAVA) != 0); // true
Console.WriteLine((flags & (int)WebBrowserDownloadControlFlags.VIDEOS) != 0); // false

但是你真的应该考虑你是否真的不想在内部将标志存储为WebBrowserDownloadControlFlags 类型。没有理由提前将其转换为 int。您也可以执行以下操作:

WebBrowserDownloadControlFlags flags = WebBrowserDownloadControlFlags.DLIMAGES
         | WebBrowserDownloadControlFlags.NOFRAMES
         | WebBrowserDownloadControlFlags.NO_FRAMEDOWNLOAD
         | WebBrowserDownloadControlFlags.NO_JAVA
         | WebBrowserDownloadControlFlags.NO_DLACTIVEXCTLS
         | WebBrowserDownloadControlFlags.NO_BEHAVIORS
         | WebBrowserDownloadControlFlags.NO_RUNACTIVEXCTLS
         | WebBrowserDownloadControlFlags.SILENT;

Console.WriteLine(flags.HasFlag(WebBrowserDownloadControlFlags.NOFRAMES)); // true
Console.WriteLine(flags.HasFlag(WebBrowserDownloadControlFlags.VIDEOS)); // false

Console.WriteLine((flags & WebBrowserDownloadControlFlags.NO_JAVA) != 0); // true
Console.WriteLine((flags & WebBrowserDownloadControlFlags.VIDEOS) != 0); // false

当你真的需要一个int值时,你可以把整个东西转换成一个int:

Console.WriteLine((int)flags); // 1074304784

【讨论】:

  • 非常感谢,因为我使用了他们将变量定义为整数的代码,我不知道如何更改他们的代码!
  • 回答你的问题,是的,我试过了,&| 运算符不适用于整数。
  • 是的,他们是。它们是按位运算符,可以很好地处理整数(如上面的第二个示例所示)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2014-03-28
  • 2011-09-10
  • 2020-10-17
相关资源
最近更新 更多