タグ付けの使用はいかがですか。それを取得するには
Public Class StringValueAttribute
Inherits Attribute
Public Property Value As String
Public Sub New(ByVal val As String)
Value = val
End Sub
End Class
:あなたのようにSTRINGVALUE属性を記述する必要があります
Public Enum MyEnum
<StringValue("Personal Contact")>Contact
<StringValue("My PersonalInfo")>PersonalInfo
End Enum
:ような何か
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
そして、列挙型を取得するためのコール(使用文字列属性):
Dim mEnum as MyEnum = GetEnumByStringValueAttribute(Of MyEnum)("Personal Contact")
(わかりやすくするために '何' を取り扱いません削除) "属性" の値から抜け出すために:
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
と(列挙型を使用して)文字列の属性を取得するためのコール:
Dim strValue as String = GetEnumValue(Of MyEnum)(MyEnum.Contact)
構造ソリューション(Slaiによる)は、4行のコードで同じことを達成します。 –
@JonHarbour Erm ...いいえ、そうではありません。文字列を使用するだけなので、厳密に型指定されたenumパターンと同じ型セーフではなく、拡張することもできず、明示的な変換を追加することもできません。また、この場合、モジュール上で構造体を使用する際のポイントがありません。 – sloth
このようなオブジェクトを 'Select Case'で比較したい場合は' Key'を公開し、 '.Key'を使って比較してください。 – mbomb007