2011-10-02 186 views
1

可能重複:
Iterating through an enumeration in Silverlight?如何通過枚舉作爲參數

我想出了一個方便的小功能讓我一個枚舉的計數(我知道這不會與所有枚舉正常工作)。而不是將Enum硬編碼到函數中,這樣我必須爲每個要使用它的Enum編寫一個分離函數,我想將該枚舉作爲參數傳遞,但我很難弄清楚如何執行此操作。

下面是代碼:

private enum MyColors { Red, Green, Blue } 

    private Int32 GetEnumCount() 
    { 
     Int32 i = 0; 
     while (Enum.IsDefined(typeof(MyColors), (MyColors)i)) 
     { 
      i++; 
     } 
     return i; 
    } 

UPDATE

我想出了這個作爲最終的答案:

private Int32 GetEnumCount(Type enumType) 
    { 
     Int32 i = 0; 
     while (Enum.IsDefined(enumType, i)) 
     { 
      i++; 
     } 
     return i; 
    } 
+0

順便說一句,該網頁上第二高的答案是我推薦的答案。 – Noldorin

+0

此方法僅適用於枚舉值連續的情況。一個'Flags'歸因枚舉通常會在所使用的整數中存在差距,所以這種方法會失敗。也許你可以解釋爲什麼你需要這個? – AnthonyWJones

回答

0

你應該採取的枚舉Type爲一個參數,並刪除演員到(MyColors)

在非Sliverlight的,你也可以只用

Enum.GetValues(typeof(MyEnum)).Length 
+2

-1複製我的答案在您的編輯! – Noldorin

+0

@Noldorin:我之前寫過這個答案,我在看到你的答案之前編寫了這個編輯。 – SLaks

+0

不,你沒有當我發佈我的答案,你的'Enum.GetValues'位是*不*包括在內。我在30秒後刷新了。你甚至稱你的枚舉類型完全一樣的東西... – Noldorin

1

此更換你的函數可以做到,但有使其與不同尋常枚舉工作需要一些額外的工作:

private static ulong GetEnumContiguousCount(Type enumType) 
{ 
    var underlyingType = Enum.GetUnderlyingType(enumType); 
    ulong i; 
    for (i = 0; Enum.IsDefined(enumType, Convert.ChangeType(i, underlyingType, null)); ++i) {} 
    return i; 
} 

演示:http://ideone.com/Serji

+0

+1:需要應付不同的底層類型是有道理的,但返回'ulong'不,'int'會做,並會更容易使用。 – AnthonyWJones

+0

@AnthonyWJones:你說的也許是對的,但我沒有這兩個查找枚舉成員的最大數量。 –

2

作爲替代(但顯然這已經回答了),如果你開始的第一個0然後在最後呼籲計數上增加一個再你可以使用,例如:

enum MyColour 
{ 
    Blue = 0, 
    Red, 
    Green, 
    ColourCount 
} 
+0

這是一個有用的銘記 – descf