2013-01-10 38 views
0

我想創建一個動態GUI,將所有Enum的選項列爲按鈕。所以,我需要一種方法將Enum類型傳遞給方法,並獲取枚舉類型可以包含的所有選項的字符串數組。如何返回包含Enum值的字符串[]

例如,給定一個枚舉聲明在文件Foo.cs:

public Enum Fruits { 
    Apple, 
    Orange, 
    Peach 
}; 

public class Foo { ... } 

我想這回:

{ "Apple", "Orange", "Peach" } 

我走過的幾個代碼置換了。現在,我有以下的,但我得到一個錯誤「類型或命名空間名稱enumeratedType「無法找到

public static string[] EnumToStringArray (System.Type enumeratedType) { 
    int   enumSize = sizeof(enumeratedType); 
    string[] enumStrings = new string[enumSize]; 

    for (int i = 0 ; i < enumSize ; i++) { 
     enumStrings[i] = enumeratedType.getValues()[i].toString(); 
    } 

    return enumStrings; 
} 

是什麼,我試圖做可能嗎?根據此問題中的信息,我嘗試了幾次完整的重寫Using sentinal values in C# enum (size of enum at compile time)?,但我無法使其工作。

+3

'Enum.GetNames(typeof(Fruits));' –

+0

這可能是使用反射和PropertInfo類來列出東西的情況 – Stokedout

+0

很酷,謝謝亞歷山大!完美的答案! –

回答

7
string[] names = Enum.GetNames(typeof(Fruits)); 
0

您可以使用類似

public static IEnumerable<string> EnumToStringArray(Type enumeratedType) { 
    if (!enumeratedType.IsEnum) 
     throw new ArgumentException("Must be an Enum", "enumeratedType"); 

    return Enum.GetNames(enumeratedType); 
} 

但即使是不必要的,因爲Enum.GetNames(...)本身拋出ArgumentException如果給定類型沒有Enum。 (謝謝@Alexander Balte)。 所以你不需要自己的功能。就像其他人已經提到的那樣,只需Enum.GetNames(typeof(Fruits))即可完成這項工作。

+2

如果'enumeratedType'不是枚舉,'Enum。無論如何,GetNames'會拋出'ArgumentException'。我沒有理由檢查'enumeratedType.IsEnum'並拋出'ArgumentException'。 –

+0

謝謝,我已經更新了我的答案以供參考,以防別人做這件事情也比需要更復雜。 – Desty

0

您似乎誤解了sizeof keyword的含義。它返回值類型「佔用」的字節數(每個字節等於8位),當它與非託管內存中的其他值對齊時。

sizeof沒有用,如果你不使用unsafe上下文(如指針)。

對於您的Fruits類型,sizeof(Fruits)返回4,因爲基礎迭代器類型是Int32(因爲這是默認情況下,您沒有另行指定時)。 Int32需要32位,因此sizeof返回4。不要緊,如果你有1,2,10或4294967296不同的成果。

注意,枚舉可以有指向相同的值,比如多個名稱:

public enum Fruits { 
    Apple, 
    Orange, 
    Peach, 
    ChineseApple = Orange, 
} 

在這個例子中,枚舉包含四個命名常量,但他們兩個「映射到」相同的值。在這種情況下,Enum.GetNames(typeof(Fruits)),會給你所有四個名字。

Enum.GetValues(typeof(Fruit))會給你一個列表的值Fruit,其中兩個是相同的。您無法事先知道兩個相同的值是否會顯示爲OrangeChineseApple,因此如果您的枚舉具有類似的副本,請不要使用此方法。

相關問題