带字符串索引或替代的枚举

时间:2013-09-18 08:35:21

标签: vb.net enums

是否可以使用enum索引从string返回值?例如,我可以使用:

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()

2 个答案:

答案 0 :(得分: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() 

答案 1 :(得分: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)

ImgNames(ImgFormat.GIF)将是'Graphic Interchange(GIF)'

如果Enum值不是默认的0,1,2 ...... IF,这将会中断(并且它确实是),然后在它周围构建一个类来存储名称或描述与枚举值。不要构建一个类来创建伪枚举,而是创建一个包含描述和枚举值的名称 - 值对列表。