私は自分のプロジェクトにウィンドウアプリケーションを使用しています。私はプロジェクトで文字列列挙を定義して使用する必要がある状況があります。
つまり.
Dim PersonalInfo As String = "Personal Info"
Dim Contanct As String = "Personal Contanct"
Public Enum Test
PersonalInfo
Contanct
End Enum
今、私は「Personal Info」と「Personal Contanct」としてその変数PersonalInfoとContractの値が欲しいです。
ENUMを使用してこの値を取得するにはどうすればよいですか?またはそれを行う他の方法。
前もって感謝します...
新しいタイプを作成できます
''' <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
そして、それを使用すると、ちょっとlooks enumのようになります:
Sub Main
DoSomething(Test.Contact)
DoSomething(Test.PersonalInfo)
End Sub
Sub DoSomething(test As Test)
Console.WriteLine(test.ToString())
End Sub
出力:
個人の連絡先
個人情報
非整数値の場合、代わりにConst
(またはStructure
)のClass
を使用できます。
Structure Test
Const PersonalInfo = "Personal Info"
Const Contanct = "Personal Contanct"
End Structure
またはTest.
部分なしで直接アクセスする場合はModule
で:
Module Test
Public Const PersonalInfo = "Personal Info"
Public Const Contanct = "Personal Contanct"
End Module
場合によっては、変数名を値として使用できます。
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)
タグ付けの使用はどうですか。何かのようなもの:
Public Enum MyEnum
<StringValue("Personal Contact")>Contact
<StringValue("My PersonalInfo")>PersonalInfo
End Enum
StringValue属性を次のように記述する必要があります。
Public Class StringValueAttribute
Inherits Attribute
Public Property Value As String
Public Sub New(ByVal val As String)
Value = val
End Sub
End Class
それを取り出すには:
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")
「属性」値を取得するには(わかりやすくするために「Nothing」の処理を削除しました):
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
および文字列属性を取得する呼び出し(Enumを使用):
Dim strValue as String = GetEnumValue(Of MyEnum)(MyEnum.Contact)
ENUMを使用してこの値を取得するにはどうすればよいですか?またはそれを行う他の方法。
列挙値を文字列にマッピングする一般的な方法は3つあります。
Dictionary(Of YourEnumType, String)
を使用しますDescriptionAttribute
)で装飾し、リフレクションで取得しますSwitch
ステートメントを使用する私の見解では、これらのオプションの最初のものはおそらく最も単純です。
これは古い投稿であり、共有する価値のあるニースのソリューションを見つけました。
''' <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
使用法:
'Can be anywhere in you applicaiton:
Link.xChangeCycleActive
これにより、不要な余分なコーディングが防止され、保守が容易になり、余分なプロセッサオーバーヘッドが最小限に抑えられると思います。
また、Visual Studioは、通常のEnumのように「Link」と入力した直後に文字列属性を表示します
リストまたはコンボで列挙型を表示するだけであれば、次のようなタグ付けを使用できます。
Private Enum MyEnum
Select_an_option___
__ACCOUNTS__
Invoices0
Review_Invoice
__MEETINGS__
Scheduled_Meetings0
Open_Meeting
Cancelled_Meetings0
Current_Meetings0
End Enum
次に、MyEnum
を文字列にプルし、Replace
(またはRegex
)を使用してタグを置き換えます:「___」を「...」に、「__」を「*に」 *」、「_」、「」、および末尾の数字を削除します。次に、配列に再パックし、次のようなコンボボックスにダンプします。
Select an option...
**ACCOUNTS**
Invoices
Review Invoice
**MEETINGS**
Scheduled Meetings
Open Meeting
Cancelled Meetings
Current Meetings
(たとえば、番号を使用して、請求書番号または会議室を入力するためのテキストフィールドを無効にすることができます。例では、Review Invoice
およびOpen Meeting
は追加の入力を予期している可能性があるため、これらの選択に対してテキストボックスが有効になっている可能性があります。
選択したコンボアイテムを解析すると、列挙は期待どおりに機能しますが、コンボを希望どおりに表示するには、コードの1行(テキスト置換)を追加するだけです。
(説明は実際のソリューションの約10倍です!)