2012-09-07 19 views
20

Estoy usando Window Application para mi proyecto. Hay una situación en la que necesito definir string enum y usarlo en mi proyecto.Definir cadena ENUM en VB.Net

decir

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

    Public Enum Test 
     PersonalInfo 
     Contanct 
    End Enum 

ahora quiero valor de esa variable PersonalInfo y contrato como "Información Personal" y "contanct personal".

¿Cómo puedo obtener este valor usando ENUM? o de cualquier otra manera de hacerlo.

Gracias de antemano ...

Respuesta

18

Se podía 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 usa, es un poco parece como una enumeración:

Sub Main 

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

End Sub 

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

de salida:

personal contanct
Información personal

+1

La solución de estructura (por Slai) logra lo mismo en 4 líneas de código. –

+0

@JonHarbour Erm ... No. No es así. Solo usa cadenas, por lo que no es tan seguro como el patrón enum fuertemente tipado, no se puede extender y no se pueden agregar conversiones explícitas. Además, no veo un punto en el uso de una estructura sobre un módulo en este caso. – sloth

+0

Si desea comparar objetos como este en un "Caso de selección", debe hacer que "Clave" sea Pública y compare usando ".Key". – mbomb007

5

¿Cómo puedo obtener este valor usando ENUM? o de cualquier otra manera de hacerlo.

Hay tres formas comunes de valores de enumeración de mapeo de cadenas:

  • Utilice un Dictionary(Of YourEnumType, String)
  • Decorar los valores de enumeración de atributos (por ejemplo DescriptionAttribute) y buscarlos con la reflexión
  • Utilice un Switch extracto

La primera de estas opciones es probablemente la el más simple, en mi opinión.

+1

gracias jon. En realidad, soy nuevo en la aplicación de Windows. ¿Puede darme un poco más de información en el primer sentido (Diccionario ...)? –

+6

@BrijeshPatel: Stack Overflow no es realmente una buena forma de aprender desde cero. Le sugiero que lea la documentación del 'Diccionario', e idealmente lea un buen libro de VB que debe abarcar las colecciones. –

+1

Ohh ok. pero de todos modos gracias por sus valiosas sugerencias. –

4

¿Qué le parece usar el etiquetado?Algo así como:

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

Usted tendría que 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 a continuación, una llamada para obtener el Enum (usando atributo de cadena):

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

para obtener el valor "Atributo" fuera (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) 
+0

¿cómo puedo obtener la cadena constante? –

+0

@Mahan - agregado al código anterior – Denis

+1

demasiado enrevesado solo para una enumeración de cadenas. –

35

Para valores no enteros, Const en un Structure (o Class) puede utilizarse en lugar:

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

o en un Module para acceder directamente sin la parte Test.:

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

En algunos casos, el nombre de la variable se puede utilizar 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) 
+2

La razón que prefiero esto sobre la clase es porque estas enumeraciones nunca deben ser instanciadas. Son solo enumeraciones de cadenas reunidas en un solo lugar y luego referidas a otros lugares con la notación de puntos. Observe con esto que no declaramos ninguna instancia de esta estructura. Es una estructura solo con el propósito de contener las constantes. Podrías hacer lo mismo con una clase. También he visto personas hacer solo propiedades de lectura con una clase. Pero estas son constantes de cadena. Entonces usamos const. –

2

Sé que esto es una puesto anterior publiqué 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 deseado codificación adicional, que es fácil de mantener y creo que esto minimiza la sobrecarga del procesador adicional.

También Visual Studio muestra los atributos de la cadena de la derecha después de escribir "Enlace" al igual que si se trata de una enumeración regulares

+0

¿Cuál es el valor de retorno para la primera const? "scVirtualMaster" o "<.lrAutoSpeed>" – RonaldPaguay

+0

devuelve la cadena completa de modo que: scVirtualMaster <.lrAutoSpeed> –

0

Si todo lo que quiero hacer es mostrar las enumeraciones en una lista o combinado, puede utilizar 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, tire de la MyEnum en una cadena y usar Replace (o Regex) para reemplazar las etiquetas: "___" con "...", "__" con "**", "_ "con" ", y eliminar los números finales. A continuación, vuelva a embalar para arriba en una matriz y lo descarga en un cuadro combinado, que se verá así:.

Select an option... 
**ACCOUNTS** 
Invoices 
Review Invoice 
**MEETINGS** 
Scheduled Meetings 
Open Meeting 
Cancelled Meetings 
Current Meetings 

(Usted puede usar los números a, por ejemplo, deshabilitar un campo de texto para introducir un número de factura o sala de reuniones En el ejemplo, Review Invoice y Open Meeting pueden estar esperando entrada adicional por lo que un cuadro de texto podría estar habilitado para esas selecciones.)

Al analizar el elemento combo 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 unas 10 veces más complicada que la solución real!)

Cuestiones relacionadas