2013-03-17 121 views
23

如何使用.NET中的枚舉實現以下功能?我想對每個包含空格的值進行說明。如何使用空格來枚舉值?

public enum PersonGender 
    { 
     Unknown = 0, 
     Male = 1, 
     Female = 2, 
     Intersex = 3, 
     Indeterminate = 3, 
     Non Stated = 9, 
     Inadequately Described = 9 
    } 

我希望能夠選擇每次使用該類型的值時是否使用描述或整數。

回答

37

沒有這不可能,但您可以將屬性附加到enum成員。 EnumMemberAttribute的設計完全符合您所描述的目的。

public enum PersonGender 
{ 
    Unknown = 0, 
    Male = 1, 
    Female = 2, 
    Intersex = 3, 
    Indeterminate = 3, 

    [EnumMember(Value = "Not Stated")] 
    NonStated = 9, 

    [EnumMember(Value = "Inadequately Described")] 
    InadequatelyDescribed = 9 
} 

有關如何使用EnumMemberAttribute將字符串轉換爲enum值的詳細信息,請參閱this thread

+0

可以了'DescriptionAttribute'使用嗎? – CJ7 2013-03-17 07:51:17

+1

是的,它可以。實際上,可以使用任何具有AttributeTargets.Field或AttributeTargets.All的屬性類。你也可以自己寫。以下是使用['DesciptionAttribute'](http://tinyurl.com/clqr3ht)和[自定義屬性](http://tinyurl.com/cyd2b6q)的示例。 – 2013-03-17 15:15:24

+0

+1非常清楚。但我有個問題。我得到'EnumMember'的類型或命名空間名稱找不到......'它如何包含在一個項目中?在Google搜索之後,我找到了3個結果,沒有一個能夠解決問題。 – demongolem 2013-09-25 15:31:40

4

這很簡單。爲您的字符串創建一個擴展方法,該方法根據您的編碼約定返回格式化的字符串。你可以在很多地方使用它,而不僅僅是在這裏。這個適用於camelCase和TitleCase。

public static String ToLabelFormat(this String s) 
    { 
     var newStr = Regex.Replace(s, "(?<=[A-Z])(?=[A-Z][a-z])", " "); 
     newStr = Regex.Replace(newStr, "(?<=[^A-Z])(?=[A-Z])", " "); 
     newStr = Regex.Replace(newStr, "(?<=[A-Za-z])(?=[^A-Za-z])", " "); 

     return newStr; 
    } 
1
var assembly = Assembly.LoadFrom("ResourcesLib.DLL");    
var resourceManager = 
new ResourceManager("ResourcesLib.EnumDescriptions", assembly);       

var lst = Enum.GetValues(typeof(PersonGender)).Cast<PersonGender>().ToList(); 
foreach (var gender in lst) 
{ 
    Console.WriteLine(gender); // Name 
    Console.WriteLine((int)gender); //Int Value 
    Console.WriteLine(resourceManager.GetString(gender.ToString()));//localized Resorce 
}   

所以空間可以駐留在本地化資源...