如何使用带有空格的枚举值?

33

我如何在.NET中使用枚举实现以下功能?我想为每个值提供包含空格的描述。

public enum PersonGender
    {
        Unknown = 0,
        Male = 1,
        Female = 2,
        Intersex = 3,
        Indeterminate = 3,
        Non Stated = 9,
        Inadequately Described = 9
    }
我希望能够在每次使用此类型的值时选择是使用描述还是整数。

另一篇帖子上的相关答案 - 我的枚举可以有友好的名称吗? - RBT
3个回答

54

不,那是不可能的,但您可以将属性附加到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 值的更多信息,请参见此主题讨论


1
可以的。实际上,任何具有 AttributeTargets.FieldAttributeTargets.All 的属性类都可以使用。您也可以编写自己的属性类。以下是使用 DesciptionAttribute自定义属性 的示例。 - p.s.w.g
非常清晰。不过我有一个问题。我收到了 The type or namespace name 'EnumMember' could not be found ... 的错误信息。这个该怎么在项目中引入呢?经过谷歌搜索,我找到了3个结果,但都没有解决我的问题。 - demongolem
1
哦,抱歉,我明白了,首先我必须将 System.Runtime.Serialization 作为项目资源包含在内,然后在文件中加入一个 using 语句。 - demongolem
1
@bonCodigo 对于在 MSDN 上找到的任何类引用,都会在语法上方列出一个命名空间和程序集。程序集是您需要添加到项目中作为引用的内容,而命名空间是您需要在文件顶部添加为“using”指令的内容。在这种情况下,两者都是“System.Runtime.Serialization”。 - p.s.w.g
将 System.Runtime.Serialization 引用添加到项目中。 - Samra
显示剩余4条评论

5

这很简单。为您的字符串创建一个扩展方法,该方法根据您的编码约定返回格式化的字符串。您可以在许多地方使用它,而不仅仅是在这里。此方法适用于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
}          

因此,空格可能存在于本地化资源中...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接