2012-05-19 138 views
3

我對擴展有點新。在發帖之前,我環顧四周尋找現有答案,因爲我討厭寫作,但我沒有看到任何我覺得有幫助的東西。擴展方法來修改枚舉值

我想要一個帶有Flag屬性的enum的擴展方法,我可以調用基本上將另一個枚舉/標誌附加到調用枚舉。

有人downvotes到這個Int32.MinValue之前,我沒有看起來相當數量,但我發現了一堆的「IsFlagSo和-SoSet」的問題和處理的標誌,而不是簡單的加一隻旗。

我所定義的枚舉爲以下:

[Flags] 
    internal enum eDiskFormat 
    { 
     None  = 0x00, 

     _3D   = 0x01, 

     Blu_ray_3D = 0x02, 

     Blu_ray  = 0x04, 

     DigitalCopy = 0x08, 

     Dvd   = 0x10 

    } 

延伸被定義爲:

internal static void AddFormat(this Movie.eDiskFormat target, Movie.eDiskFormat newFormat) 
    { 
     target |= newFormat; 
    } 

當我人稱其爲下文中,我期望得到的枚舉爲Movie.eDiskFormat .Blu_ray ...(它已初始化爲eDiskFormat.None)。

m.DiskFormat.AddFormat(Movie.eDiskFormat.Blu_ray); 

取而代之,結果值仍然是eDiskFormat.None。我認爲「this」這個變量的傳遞是類似於通過引用傳遞的,但我顯然是不正確的。該方法內的價值正如我所想,但結果......呃,我想我已經說過了;因此這個問題。

+0

請不要用 「C#枚舉」 和這樣的前綴您的圖書。這就是標籤的用途。 –

+0

看看這裏:http://www.codeproject.com/Articles/37921/Enums-Flags-and-C-Oh-my-bad-pun那裏有一些很好的擴展。 –

+0

@ChrisSinclair謝謝,那是一篇很好的文章。 – pennyrave

回答

3

枚舉值類型。它們是不可改變的。你不能改變他們的價值。

你能做的最好是這樣的:

m.DiskFormat = m.DiskFormat.AddFormat(Movie.eDiskFormat.Blu_ray); 

internal static Movie.eDiskFormat AddFormat(this Movie.eDiskFormat target, 
               Movie.eDiskFormat newFormat) 
{ 
    return target | newFormat; 
} 
+0

正確 - 我會補充說最好是有一個Disk類包含DiskFormat標誌枚舉的方法。磁盤可能有其他有用的方法(如長度等) –

+0

啊..好吧,設計是,它只是一個簡單的跟蹤它是什麼樣的DVD光盤,DVD,Bul-ray,藍光3D,數字拷貝等等,它不會被添加到以上。我沒有修改任何東西,所以靜態類型的枚舉運行良好。不過謝謝你。 – pennyrave