programing

VB에서 String ENUM을 정의합니다.그물

padding 2023. 7. 2. 19:05
반응형

VB에서 String ENUM을 정의합니다.그물

저는 제 프로젝트에 윈도우 애플리케이션을 사용하고 있습니다.문자열 열거형을 정의하고 프로젝트에서 사용해야 하는 상황이 있습니다.

예.

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

    Public Enum Test
        PersonalInfo
        Contanct
    End Enum

이제 저는 변수 개인 정보 및 계약의 가치를 "개인 정보" 및 "개인 연락"으로 원합니다.

ENUM을 사용하여 이 값을 얻으려면 어떻게 해야 합니까?또는 다른 방법으로 할 수 있습니다.

잘 부탁드립니다...

가 아닌 값의 경우에는 정가아 값경의 우닌수Const순식간에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)

새 유형을 생성할 수 있습니다.

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

출력:

연락처
정보 제공

태그 지정을 사용하는 것은 어떻습니까?다음과 같은 것:

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

"속성" 값을 빼려면(명확하게 설명하기 위해 '없음' 처리가 제거됨):

  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)

ENUM을 사용하여 이 값을 얻으려면 어떻게 해야 합니까?또는 다른 방법으로 할 수 있습니다.

열거값을 문자열에 매핑하는 세 가지 일반적인 방법은 다음과 같습니다.

  • 을 합니다.Dictionary(Of YourEnumType, String)
  • 열형값예속성을거예()으로 합니다.DescriptionAttribute과 함께 ) 그고리반함그데들려니다옵을께성과▁)다▁them.
  • 을 합니다.Switch

제가 보기에, 이 옵션들 중 첫 번째는 아마도 가장 단순할 것입니다.

저는 이것이 오래된 게시물이라는 것을 알고 있습니다. 공유할 가치가 있는 멋진 솔루션을 찾았습니다.

''' <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"를 입력한 직후 문자열 속성을 표시합니다.

목록이나 콤보에 열거형을 표시하기만 원하는 경우 다음과 같은 태그를 사용할 수 있습니다.

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추가 입력을 예상할 수 있으므로 해당 선택에 대해 텍스트 상자를 사용할 수 있습니다.)

선택한 콤보 항목을 구문 분석하면 열거형이 예상대로 작동하지만 콤보가 원하는 대로 보이도록 하려면 코드 한 줄(텍스트 대체)만 추가하면 됩니다.

(설명은 실제 솔루션의 약 10배에 해당합니다!)

Microsoft의 "How to: Determinate the String Associated with an Enumeration Value (Visual Basic)" 기술은 일부 상황에서 유용할 것입니다(불행히도 제 기술에는 도움이 되지 않았습니다).Microsoft의 예:

VB:

Public Enum flavorEnum
    salty
    sweet
    sour
    bitter
End Enum

Private Sub TestMethod()
    MsgBox("The strings in the flavorEnum are:")
    Dim i As String
    For Each i In [Enum].GetNames(GetType(flavorEnum))
        MsgBox(i)
    Next
End Sub

언급URL : https://stackoverflow.com/questions/12312325/define-string-enum-in-vb-net

반응형