web-dev-qa-db-ja.com

VB.Netで文字列ENUMを定義する

私は自分のプロジェクトにウィンドウアプリケーションを使用しています。私はプロジェクトで文字列列挙を定義して使用する必要がある状況があります。

つまり.

Dim PersonalInfo As String = "Personal Info"
Dim Contanct As String = "Personal Contanct"

    Public Enum Test
        PersonalInfo
        Contanct
    End Enum

今、私は「Personal Info」と「Personal Contanct」としてその変数PersonalInfoとContractの値が欲しいです。

ENUMを使用してこの値を取得するにはどうすればよいですか?またはそれを行う他の方法。

前もって感謝します...

26
Brijesh Patel

新しいタイプを作成できます

''' <completionlist cref="Test"/>
Class Test

    Private Key As String

    Public Shared ReadOnly Contact  As Test = New Test("Personal Contanct")
    Public Shared ReadOnly PersonalInfo As Test = New Test("Personal Info")

    Private Sub New(key as String)
        Me.Key = key
    End Sub

    Public Overrides Function ToString() As String
        Return Me.Key
    End Function
End Class

そして、それを使用すると、ちょっとlooks enumのようになります:

Sub Main

    DoSomething(Test.Contact)
    DoSomething(Test.PersonalInfo)

End Sub

Sub DoSomething(test As Test)
    Console.WriteLine(test.ToString())
End Sub

出力:

個人の連絡先
個人情報

21
sloth

非整数値の場合、代わりにConst(またはStructure)のClassを使用できます。

Structure Test
    Const PersonalInfo = "Personal Info"
    Const Contanct = "Personal Contanct"
End Structure

またはTest.部分なしで直接アクセスする場合はModuleで:

Module Test
    Public Const PersonalInfo = "Personal Info"
    Public Const Contanct = "Personal Contanct"
End Module

場合によっては、変数名を値として使用できます。

Enum Test
    Personal_Info
    Personal_Contanct
End Enum

Dim PersonalInfo As String = Test.Personal_Info.ToString.Replace("_"c, " "c)

' or in Visual Studio 2015 and newer:
Dim Contanct As String = NameOf(Test.Personal_Contanct).Replace("_"c, " "c)
44
Slai

タグ付けの使用はどうですか。何かのようなもの:

Public Enum MyEnum
<StringValue("Personal Contact")>Contact
<StringValue("My PersonalInfo")>PersonalInfo
End Enum

StringValue属性を次のように記述する必要があります。

Public Class StringValueAttribute
    Inherits Attribute

    Public Property Value As String
    Public Sub New(ByVal val As String)
        Value = val
    End Sub

End Class

それを取り出すには:

 Public Function GetEnumByStringValueAttribute(value As String, enumType As Type) As Object
    For Each val As [Enum] In [Enum].GetValues(enumType)
        Dim fi As FieldInfo = enumType.GetField(val.ToString())
        Dim attributes As StringValueAttribute() = DirectCast(fi.GetCustomAttributes(GetType(StringValueAttribute), False), StringValueAttribute())
        Dim attr As StringValueAttribute = attributes(0)
        If attr.Value = value Then
            Return val
        End If
    Next
    Throw New ArgumentException("The value '" & value & "' is not supported.")
End Function

Public Function GetEnumByStringValueAttribute(Of YourEnumType)(value As String) As YourEnumType
    Return CType(GetEnumByStringValueAttribute(value, GetType(YourEnumType)), YourEnumType)
End Function

そして、文字列属性を使用して列挙型を取得するための呼び出し:

Dim mEnum as MyEnum = GetEnumByStringValueAttribute(Of MyEnum)("Personal Contact")

「属性」値を取得するには(わかりやすくするために「Nothing」の処理を削除しました):

  Public Function GetEnumValue(Of YourEnumType)(p As YourEnumType) As String
        Return DirectCast(Attribute.GetCustomAttribute(ForValue(p), GetType(StringValueAttribute)), StringValueAttribute).Value
  End Function

  Private Function ForValue(Of YourEnumType)(p As YourEnumType) As MemberInfo
        Return GetType(YourEnumType).GetField([Enum].GetName(GetType(YourEnumType), p))
  End Function

および文字列属性を取得する呼び出し(Enumを使用):

Dim strValue as String = GetEnumValue(Of MyEnum)(MyEnum.Contact)
7
Denis

ENUMを使用してこの値を取得するにはどうすればよいですか?またはそれを行う他の方法。

列挙値を文字列にマッピングする一般的な方法は3つあります。

  • Dictionary(Of YourEnumType, String)を使用します
  • 列挙値を属性(たとえば、DescriptionAttribute)で装飾し、リフレクションで取得します
  • Switchステートメントを使用する

私の見解では、これらのオプションの最初のものはおそらく最も単純です。

5
Jon Skeet

これは古い投稿であり、共有する価値のあるニースのソリューションを見つけました。

''' <summary>
''' Gives acces to strings paths that are used often in the application
''' </summary>
Public NotInheritable Class Link        
    Public Const lrAutoSpeed As String          = "scVirtualMaster<.lrAutoSpeed>"
    Public Const eSimpleStatus As String        = "scMachineControl<.eSimpleStatus>"
    Public Const xLivebitHMI As String          = "scMachineControl<.xLivebitHMI>"      
    Public Const xChangeCycleActive As String   = "scMachineControl<.xChangeCycleActive>"

End Class

使用法:

'Can be anywhere in you applicaiton:
Link.xChangeCycleActive

これにより、不要な余分なコーディングが防止され、保守が容易になり、余分なプロセッサオーバーヘッドが最小限に抑えられると思います。

また、Visual Studioは、通常のEnumのように「Link」と入力した直後に文字列属性を表示します

4
Rob Heijligers

リストまたはコンボで列挙型を表示するだけであれば、次のようなタグ付けを使用できます。

Private Enum MyEnum
    Select_an_option___
    __ACCOUNTS__
    Invoices0
    Review_Invoice
    __MEETINGS__
    Scheduled_Meetings0
    Open_Meeting
    Cancelled_Meetings0
    Current_Meetings0
End Enum

次に、MyEnumを文字列にプルし、Replace(またはRegex)を使用してタグを置き換えます:「___」を「...」に、「__」を「*に」 *」、「_」、「」、および末尾の数字を削除します。次に、配列に再パックし、次のようなコンボボックスにダンプします。

Select an option...
**ACCOUNTS**
Invoices
Review Invoice
**MEETINGS**
Scheduled Meetings
Open Meeting
Cancelled Meetings
Current Meetings

(たとえば、番号を使用して、請求書番号または会議室を入力するためのテキストフィールドを無効にすることができます。例では、Review InvoiceおよびOpen Meetingは追加の入力を予期している可能性があるため、これらの選択に対してテキストボックスが有効になっている可能性があります。

選択したコンボアイテムを解析すると、列挙は期待どおりに機能しますが、コンボを希望どおりに表示するには、コードの1行(テキスト置換)を追加するだけです。

(説明は実際のソリューションの約10倍です!)

2
SteveCinq