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...
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
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)
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)
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:
Dictionary(Of YourEnumType, String)
DescriptionAttribute
) et récupérez-les avec réflexionSwitch
À mon avis, la première de ces options est probablement la plus simple.
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