¿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)
La solución de estructura (por Slai) logra lo mismo en 4 líneas de código. –
@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
Si desea comparar objetos como este en un "Caso de selección", debe hacer que "Clave" sea Pública y compare usando ".Key". – mbomb007