How to work with integer flags

1

I am trying to set an integer variable to a combination of an enum values, the enum is:

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,
}

The DownloadControlFlags is an integer field:

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

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

To set this variable I used summation as :

  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;

I am not sure if it is the correct way, but it seems that it works. But now I want to check if the variable contains an specific value or not. For normal enum the solution could be the answer of this question How to check if any flags of a flag combination are set?, but I am not sure if I can use the same way in my case.

How can I check if a specific flag has been set or not?! for example if the DownloadControlFlags contains WebBrowserDownloadControlFlags.NO_JAVA or not!

c#
enums
asked on Stack Overflow Dec 29, 2015 by Ahmad • edited May 23, 2017 by Community

1 Answer

3

For normal enum the solution could be the answer of this question How to check if any flags of a flag combination are set?, but I am not sure if I can use the same way in my case.

Have you tried it?

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;

You can either use Enum.HasFlag by casting it back to your enum type:

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

Or you can cast the enum flag you want to compare against into an int and then make a bit-wise comparison:

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

But you should really consider whether you actually don’t want to store the flags internally as a WebBrowserDownloadControlFlags type. There is no reason to convert it into an int early. And you could just as well do the following:

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

And whenever you really need an int value, you can just convert the whole thing into an int:

Console.WriteLine((int)flags); // 1074304784
answered on Stack Overflow Dec 29, 2015 by poke • edited May 23, 2017 by Community

User contributions licensed under CC BY-SA 3.0