32

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

すなわち

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

    Public Enum Test
        PersonalInfo
        Contanct
    End Enum

ここで、その変数 PersonalInfo と Contract の値を「個人情報」と「個人連絡先」として取得したいと考えています。

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

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

4

7 に答える 7

53

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

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

またはModule、パーツなしで直接アクセスするTest.場合:

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)
于 2013-04-24T19:01:01.497 に答える
26

新しいタイプを作成するだけです

''' <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

使用すると、列挙型のようになります。

Sub Main

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

End Sub

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

出力:

個人連絡先
個人情報

于 2012-09-07T07:05:31.743 に答える
11

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

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

次に、Enum を取得するための呼び出し (文字列属性を使用):

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)
于 2013-01-31T20:53:55.260 に答える
5

これは古い投稿であることは知っていますが、共有する価値のある素晴らしい解決策を見つけました。

''' <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」と入力した直後に文字列属性を表示します

于 2014-08-15T13:36:19.223 に答える
5

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

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

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

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

于 2012-09-07T05:42:23.060 に答える