web-dev-qa-db-fra.com

Définir la chaîne ENUM dans VB.Net

J'utilise l'application Windows pour mon projet. Il y a une situation où j'ai besoin de définir une énumération de chaînes et de l'utiliser dans mon projet.

c'est à dire.

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

    Public Enum Test
        PersonalInfo
        Contanct
    End Enum

Maintenant, je veux que la valeur de cette variable PersonalInfo and Contract soit "Personal Info" et "Personal Contanct".

Comment puis-je obtenir cette valeur en utilisant ENUM? ou tout autre moyen de le faire.

Merci d'avance...

26
Brijesh Patel

Vous pouvez simplement créer un nouveau type

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

et quand vous l'utilisez, il ressemble comme une énumération:

Sub Main

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

End Sub

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

production:

Contanct personnel
Informations personnelles

21
sloth

Pour les valeurs non entières, Const dans un Structure (ou Class) peut être utilisé à la place:

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

ou dans un Module pour un accès direct sans le Test. partie:

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

Dans certains cas, le nom de variable peut être utilisé comme valeur:

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

Que diriez-vous d'utiliser le balisage. Quelque chose comme:

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

Vous devez écrire l'attribut StringValue comme suit:

Public Class StringValueAttribute
    Inherits Attribute

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

End Class

Pour le sortir:

 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

Et puis un appel pour obtenir l'énumération (en utilisant l'attribut de chaîne):

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

Pour extraire la valeur "Attribut" (suppression de la gestion "Rien" pour plus de clarté):

  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

Et l'appel pour obtenir l'attribut string (en utilisant Enum):

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

Comment puis-je obtenir cette valeur en utilisant ENUM? ou tout autre moyen de le faire.

Il existe trois façons courantes de mapper des valeurs d'énumération à des chaînes:

  • Utilisez une Dictionary(Of YourEnumType, String)
  • Décorez les valeurs d'énumération avec des attributs (par exemple DescriptionAttribute) et récupérez-les avec réflexion
  • Utilisez une instruction Switch

À mon avis, la première de ces options est probablement la plus simple.

5
Jon Skeet

Je sais que c'est un vieux post, j'ai trouvé une bonne solution qui mérite d'être partagée:

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

Usage:

'Can be anywhere in you applicaiton:
Link.xChangeCycleActive

Cela empêche le codage supplémentaire indésirable, il est facile à entretenir et je pense que cela minimise la surcharge de processeur supplémentaire.

Visual Studio affiche également les attributs de chaîne juste après avoir tapé "Link" comme s'il s'agissait d'un Enum normal

4
Rob Heijligers