2013-09-18 2 views
2

Можно ли вернуть значение от enum с индексом string? Например, я могу использовать:Enum со строковым индексом или альтернативой

Enum test 
    firstval 
    secondval 
    thirdval 
End Enum 

Dim index As Integer = 1 

CType(index, test).ToString() 

firstval вернуться, но есть способ, чтобы сделать что-то подобное, где индекс является значением string? Например:

Enum test 
    firstval = "one" 
    secondval = "two" 
    thirdval = "three" 
End Enum 

Dim index As string = "one" 

CType(index, test).ToString() 
+0

Прежде всего, вы не можете установить 'Enum' как' string': * Оператор Enum может объявить тип данных перечисления. Каждый член принимает тип данных перечисления. Вы можете указать Byte, Integer, Long, SByte, Short, UInteger, ULong или UShort. * – MarcinJuraszek

+0

Вместо этого используйте 'Dictionary '. – NeverHopeless

ответ

3

Это не возможно с помощью Enum, но вы можете легко создать тип, который может делать то, что вы хотите, используя оператор Narrowing.

простой пример:

Class Test 

    Private Shared _lookup As Dictionary(Of String, Test) 

    Private Key As String 
    Private Name As String 

    Public Shared ReadOnly firstval As Test = New Test("one", "firstval") 
    Public Shared ReadOnly secondval As Test = New Test("two", "secondval") 
    Public Shared ReadOnly thirdval As Test = New Test("three", "thirdval") 

    Private Sub New(key As String, name As String) 
     Me.Key = key 
     Me.Name = name 
     If _lookup Is Nothing Then _ 
      _lookup = New Dictionary(Of String, Test) 

     _lookup.Add(key, Me) 
    End Sub 

    Public Overrides Function ToString() As String 
     Return Me.Name ' or whatever you want ' 
    End Function 

    Public Shared Widening Operator CType(obj As Test) As String 
     Return obj.Key 
    End Operator 

    Public Shared Narrowing Operator CType(key As String) As Test 
     Return _lookup(key) 
    End Operator 

End Class 

использование:

Dim index As string = "one" 

' returns firstval ' 
CType(index, Test).ToString() 
+0

Ничего себе, это выглядит великолепно! Я не уверен, что я точно понимаю, что происходит с расширяющимися и сужающимися операторами, знаете ли вы какие-либо ссылки на это? Я попробовал поиграть в Google, но я не придумал много! – doovers

+1

@doovers [Как определить оператора преобразования] (http://msdn.microsoft.com/en-us/library/yf7b9sy7.aspx) – sloth

+1

Спасибо человеку, которого я многому научился от вашего ответа! – doovers

1

Есть несколько других вариантов.

Одним из них является получение имен, используемых в перечислении. Например:

Friend Enum ImgFormat 
    Bitmap 
    GIF 
    JPeg 
    TIFF 
    PNG 
End Enum 

Dim ImgNames() As String 
... 
ImgNames = [Enum].GetNames(GetType(ImgFormat)) 

Если имена не являются дружественными достаточно, украшают их описанием:

Imports System.ComponentModel 

Friend Enum ImgFormat 
    <Description("Bitmap (BMP)")> Bitmap 
    <Description("Graphic Interchange (GIF)")> GIF 
    <Description("Jpg/JPeg (JPG)")> JPeg 
    <Description("Tagged Image (TIFF)")> TIFF 
    <Description("Portable Graphics (PNG)")> PNG 
End Enum 

Для получения описания, требует осмысления, которое вовлекается:

Imports System.Reflection 
Imports System.ComponentModel 

Public Class EnumConverter 
' gets a single enum description 
Public Shared Function GetEnumDescription(ByVal EnumConstant As [Enum]) As String 
    Dim fi As FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString()) 
    Dim attr() As DescriptionAttribute = _ 
     DirectCast(_ 
      fi.GetCustomAttributes(GetType(DescriptionAttribute), False), _ 
      DescriptionAttribute()) 

     If attr.Length > 0 Then 
      Return attr(0).Description 
     Else 
      Return EnumConstant.ToString() 
     End If 
End Function 

' get all the enum descriptions: 
Public Shared Function GetEnumDescriptions(ByVal type As Type) As String() 
    Dim n As Integer = 0 

    Dim enumValues As Array = [Enum].GetValues(type) 
    Dim Descr(enumValues.Length - 1) As String 

    For Each value As [Enum] In enumValues 
     Descr(n) = GetEnumDescription(value) 
     n += 1 
    Next 

    Return Descr 

End Function 
End Class 

Чтобы использовать :

Dim ImgNames() As String = EnumConverter.GetEnumDescriptions(ImgFormat) 

будет «Graphic Interchange (GIF)»

Это сломается, если значения Enum не являются значениями по умолчанию 0, 1, 2 ... ЕСЛИ это проблема (и это действительно так), а затем постройте класс вокруг него, чтобы сохранить имя или описание с помощью значения Enum. Вместо того, чтобы создавать класс для создания псевдо-перечисления, создайте список пар имен и значений, состоящий из Описания и значения Enum.

+0

Спасибо, как я могу получить описание с использованием значения enum? – doovers

+1

Используйте класс EnumConverter (показано), чтобы получить описание в массив, а затем заданное значение Enum (когда значение по умолчанию vals...) также является индексом в массиве для этого описания (как показано). Если 'x' является' ImgFormat.GIF', то 'ImgNames (x)' будет 'Graphic Interchange (GIF)' – Plutonix

Смежные вопросы