2010-07-06 1 views
4

Приложение, в котором я работаю, имеет множество перечислений.Как хранить описания строк значений перечисления?

Эти значения обычно выбираются из раскрывающихся списков приложения.

Каков общепринятый способ хранения строкового описания этих значений?

Вот текущий вопрос под руку:

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

Выпадающие должны иметь следующие выборы:

Some Value 
Another Value 
Yet Another Value (Minor Description) 

Не все подходят имя перечисления, (второстепенное описание на один пример), а не все значения перечисления - текущие значения. Некоторые из них остаются только для обратной совместимости и отображения (например, распечатки, а не формы).

Это приводит к следующей ситуации коды:

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 

Это только кажется, что это может быть сделано лучше, и я не знаю, как.

ответ

11

Вы можете использовать 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

+0

Спасибо за исходную ссылку, дает хорошие идеи для дальнейшего расширения этой возможности. –

1

Самый распространенный способ я видел, чтобы аннотировать перечислений с 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. Относитесь к нему как псевдокод;)

+0

Это работает, если локализация не требуется. – driis

3

Я бы поместил их в resource file, где ключ - имя перечисления, возможно, с префиксом. Таким образом, вы можете легко локализовать значения строк.