2

インデックスから値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()
4

2 に答える 2

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() 
于 2013-09-18T09:08:39.490 に答える
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ではない場合、これは問題になります(実際にはそうです)。次に、その周りにクラスを構築して、名前または説明をEnum値とともに保存します。クラスを構築して疑似列挙を作成するのではなく、説明と列挙値で構成される名前と値のペアのリストを作成するクラスを作成します。

于 2013-09-18T14:44:41.900 に答える