net enum vb.net string enums windows-applications

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