代码之家  ›  专栏  ›  技术社区  ›  Brett Allen

如何存储枚举值的字符串描述?

  •  4
  • Brett Allen  · 技术社区  · 14 年前

    我正在开发的应用程序有很多枚举。

    这些值通常从应用程序的下拉列表中选择。

    存储这些值的字符串描述的一般公认方法是什么?

    以下是当前的问题:

    Public Enum MyEnum
       SomeValue = 1
       AnotherValue = 2
       ObsoleteValue = 3
       YetAnotherValue = 4
    End Enum
    

    下拉列表应具有以下选项:

    Some Value
    Another Value
    Yet Another Value (Minor Description)
    

    不是所有的都符合枚举的名称(一个上面的次要描述就是一个例子),并且不是所有的枚举值都是-current-值。有些只保留用于向后兼容性和显示目的(即打印输出,而不是表单)。

    这将导致以下代码情况:

    For index As Integer = 0 To StatusDescriptions.GetUpperBound(0)
       ' Only display relevant statuses.
       If Array.IndexOf(CurrentStatuses, index) >= 0 Then
          .Items.Add(New ExtendedListViewItem(StatusDescriptions(index), index))
       End If
    Next
    

    这似乎可以做得更好,我不知道怎么做。

    3 回复  |  直到 14 年前
        1
  •  11
  •   ChrisF PerfectlyRock    14 年前

    你可以用 Description 属性(C代码,但它应该翻译):

    public enum XmlValidationResult
    {
        [Description("Success.")]
        Success,
        [Description("Could not load file.")]
        FileLoadError,
        [Description("Could not load schema.")]
        SchemaLoadError,
        [Description("Form XML did not pass schema validation.")]
        SchemaError
    }
    
    private string GetEnumDescription(Enum value)
    {
        // Get the Description attribute value for the enum value
        FieldInfo fi = value.GetType().GetField(value.ToString());
        DescriptionAttribute[] attributes = 
            (DescriptionAttribute[])fi.GetCustomAttributes(
                typeof(DescriptionAttribute), false);
    
        if (attributes.Length > 0)
        {
            return attributes[0].Description;
        }
        else
        {
            return value.ToString();
        }
    }
    

    Source

        2
  •  3
  •   driis    14 年前

    我会把它们放在 resource file ,其中键是枚举名称,可能带有前缀。这样,您也可以轻松地本地化字符串值。

        3
  •  1
  •   womp    14 年前

    我看到的最常见的方法是用 System.ComponentModel.DescriptionAttribute .

    Public Enum MyEnum
    
       <Description("Some Value")>
       SomeValue = 1
    ...
    

    然后,要获取该值,请使用扩展方法(对不起,我的C,我将在一分钟内转换它):

    <System.Runtime.CompilerServices.Extension()> 
    Public Function GetDescription(ByVal value As Enum) As String
       Dim description As String =  String.Empty 
    
       Dim fi As FieldInfo =  value.GetType().GetField(value.ToString()) 
       Dim da = 
           CType(Attribute.GetCustomAttribute(fi,Type.GetType(DescriptionAttribute)),
                                                 DescriptionAttribute)
    
       If da Is Nothing
          description = value.ToString()
       Else
          description = da.Description
       End If
    
       Return description
    End Function
    

    这是我把它转换成vb的最佳方法。将其视为伪代码;)