2015-12-29 24 views
1

我想一個整型變量設置爲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或不包含!

+0

您可以轉換INT到一個枚舉,並檢查它的標誌:'WebBrowserDownloadControlFlags foo =(WebBrowserDownloadControlFlags)yourInt;' –

回答

3

對於正常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 
+0

非常感謝你,因爲我使用了一個代碼,他們將變量定義爲整數,我不知道如何改變它們碼! – Ahmad

+0

要回答你的問題,是的,我試過了,'&'和'|'運算符不適用於整數。 – Ahmad

+0

是的,他們是。它們是按位運算符,在整數上工作得很好(如上面第二個例子所示)。 – poke