Definir cadena ENUM en VB.Net
.net enum (6)
Estoy usando Window Application para mi proyecto. Hay una situación en la que necesito definir string enum y usarlo en mi proyecto.
es decir
Dim PersonalInfo As String = "Personal Info"
Dim Contanct As String = "Personal Contanct"
Public Enum Test
PersonalInfo
Contanct
End Enum
Ahora quiero el valor de esa variable PersonalInfo y Contract como "Información personal" y "Contacta personal".
¿Cómo puedo obtener este valor usando ENUM? o de cualquier otra manera de hacerlo.
Gracias por adelantado...
¿Cómo puedo obtener este valor usando ENUM? o de cualquier otra manera de hacerlo.
Hay tres formas comunes de asignar valores enum a cadenas:
- Use un
Dictionary(Of YourEnumType, String)
- Decora los valores enum con atributos (ej.
DescriptionAttribute
) y tómalos con reflejo - Use una declaración
Switch
La primera de estas opciones es probablemente la más simple, desde mi punto de vista.
¿Qué hay de usar el etiquetado? Algo como:
Public Enum MyEnum
<StringValue("Personal Contact")>Contact
<StringValue("My PersonalInfo")>PersonalInfo
End Enum
Debería escribir el atributo StringValue como:
Public Class StringValueAttribute
Inherits Attribute
Public Property Value As String
Public Sub New(ByVal val As String)
Value = val
End Sub
End Class
Para sacarlo:
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
Y luego una llamada para obtener el Enum (usando el atributo de cadena):
Dim mEnum as MyEnum = GetEnumByStringValueAttribute(Of MyEnum)("Personal Contact")
Para obtener el valor "Atributo" (eliminado el manejo de "Nada" para mayor claridad):
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
Y la llamada para obtener el atributo de cadena (usando Enum):
Dim strValue as String = GetEnumValue(Of MyEnum)(MyEnum.Contact)
Para valores no enteros, Const
en una Structure
(o Class
) se puede utilizar en su lugar:
Structure Test
Const PersonalInfo = "Personal Info"
Const Contanct = "Personal Contanct"
End Structure
o en un Module
para acceso directo sin la Test.
parte:
Module Test
Public Const PersonalInfo = "Personal Info"
Public Const Contanct = "Personal Contanct"
End Module
En algunos casos, el nombre de la variable se puede usar como un valor:
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)
Podrías simplemente crear un nuevo tipo
'''''' <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
y cuando lo usas, parece una enumeración:
Sub Main
DoSomething(Test.Contact)
DoSomething(Test.PersonalInfo)
End Sub
Sub DoSomething(test As Test)
Console.WriteLine(test.ToString())
End Sub
salida:
Contanct personal
Información personal
Sé que esta es una publicación anterior. Encontré una buena solución que vale la pena compartir:
'''''' <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
Uso:
''Can be anywhere in you applicaiton:
Link.xChangeCycleActive
Esto evita la codificación adicional no deseada, es fácil de mantener y creo que esto minimiza la sobrecarga del procesador adicional.
También visual studio muestra los atributos de cadena justo después de que escribe "Link" como si fuera un Enum regular
Si todo lo que quiere hacer es mostrar las enumeraciones en una lista o combo, puede usar el etiquetado como
Private Enum MyEnum
Select_an_option___
__ACCOUNTS__
Invoices0
Review_Invoice
__MEETINGS__
Scheduled_Meetings0
Open_Meeting
Cancelled_Meetings0
Current_Meetings0
End Enum
A continuación, MyEnum
en una cadena y use Replace
(o Regex
) para reemplazar las etiquetas: "___" con "...", "__" con "**", "_" con "", y elimine los números finales. Luego vuelva a embalarlo en una matriz y colóquelo en un cuadro combinado que se verá así:
Select an option...
**ACCOUNTS**
Invoices
Review Invoice
**MEETINGS**
Scheduled Meetings
Open Meeting
Cancelled Meetings
Current Meetings
(Puede usar los números para, por ejemplo, deshabilitar un campo de texto para ingresar un número de factura o sala de reuniones. En el ejemplo, Review Invoice
y Open Meeting
podría estar esperando entrada adicional para que un cuadro de texto pueda habilitarse para esas selecciones).
Cuando analiza el elemento combinado seleccionado, la enumeración funcionará como se esperaba, pero solo necesita agregar una sola línea de código, el reemplazo de texto, para que el combo se vea como lo desee.
(¡La explicación es aproximadamente 10 veces más complicada que la solución real!)