Определить строку ENUM в VB.Net
Я использую Window Application для своего проекта. Есть ситуация, когда мне нужно определить перечисление строки и использовать ее в моем проекте.
то есть.
Dim PersonalInfo As String = "Personal Info"
Dim Contanct As String = "Personal Contanct"
Public Enum Test
PersonalInfo
Contanct
End Enum
Теперь я хочу значение этой переменной PersonalInfo и Contract как "Личная информация" и "Персональный контент".
Как я могу получить это значение с помощью ENUM? или любой другой способ сделать это.
Спасибо заранее...
Ответы
Ответ 1
Вы можете просто создать новый тип
''' <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
и когда вы его используете, он выглядит как enum:
Sub Main
DoSomething(Test.Contact)
DoSomething(Test.PersonalInfo)
End Sub
Sub DoSomething(test As Test)
Console.WriteLine(test.ToString())
End Sub
выход:
Персональный Контент Личная информация
Ответ 2
Для нецелых значений вместо Structure
(или Class
) можно использовать Const
:
Structure Test
Const PersonalInfo = "Personal Info"
Const Contanct = "Personal Contanct"
End Structure
или в Module
для прямого доступа без части Test.
:
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)
Ответ 3
Как я могу получить это значение с помощью ENUM? или любой другой способ сделать это.
Существует три общих способа отображения значений перечисления в строки:
- Используйте
Dictionary(Of YourEnumType, String)
- Украсить значения перечисления атрибутами (например,
DescriptionAttribute
) и получить их с отражением
- Используйте оператор
Switch
Первый из этих вариантов, вероятно, самый простой, на мой взгляд.
Ответ 4
Как насчет использования меток. Что-то вроде:
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
И затем вызов для получения Enum (с использованием строкового атрибута):
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)
Ответ 5
Я знаю, что это старый пост, я нашел хорошее решение, которое стоит поделиться:
''' <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
Это предотвращает нежелательное дополнительное кодирование, его легко поддерживать, и я думаю, что это минимизирует дополнительные накладные расходы процессора.
Также визуальная студия отображает строковые атрибуты сразу после того, как вы наберете "Ссылка",
так же, как если бы он был обычным Enum
Ответ 6
Если все, что вы хотите сделать, это отобразить перечисления в списке или комбо, вы можете использовать теги, такие как
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
могут ожидать дополнительный ввод, поэтому текстовое поле может быть включено для эти выборы.)
При анализе выбранного комбинированного элемента перечисление будет работать так, как ожидалось, но вам действительно нужно добавить только одну строку кода - замену текста - чтобы получить комбо, чтобы выглядеть так, как вы пожелаете.
(Объяснение примерно в 10 раз связано с фактическим решением!)