2013-03-17 119 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 
}   

所以空间可以驻留在本地化资源...