Подтвердить что ты не робот

Определить строку 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? или любой другой способ сделать это.

Спасибо заранее...

4b9b3361

Ответ 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 раз связано с фактическим решением!)