2012-09-07 15 views
20

Używam aplikacji Okno do mojego projektu. Jest sytuacja, w której muszę zdefiniować wyrażenie łańcuchowe i użyć go w moim projekcie.Definiowanie łańcucha znaków ENUM w VB.Net

tj

Dim PersonalInfo As String = "Personal Info" 
Dim Contanct As String = "Personal Contanct" 

    Public Enum Test 
     PersonalInfo 
     Contanct 
    End Enum 

Teraz chcę wartość tej zmiennej PersonalInfo zamówienia oraz jako "Informacje osobiste" i "Personal Contanct".

Jak mogę uzyskać tę wartość za pomocą ENUM? lub w inny sposób to zrobić.

góry dzięki ...

Odpowiedz

18

Można po prostu utworzyć nowy typ

''' <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 

i kiedy go używać, to trochę wygląda jak ENUM:

Sub Main 

    DoSomething(Test.Contact) 
    DoSomething(Test.PersonalInfo) 

End Sub 

Sub DoSomething(test As Test) 
    Console.WriteLine(test.ToString()) 
End Sub 

wyjściowego:

osobowych Contanct
Dane osobowe

+1

Rozwiązanie konstrukcyjne (przez Slai) realizuje to samo w 4 liniach kodu. –

+0

@JonHarbour Erm ... Nie. Nie działa. Po prostu używa ciągów, więc nie jest tak bezpieczny, jak mocno wpisany wzorzec wyliczeniowy, nie można go rozszerzyć i nie można dodawać jawnych konwersji. Ponadto nie widzę sensu w używaniu struktury nad modułem w tym przypadku. – sloth

+0

Jeśli chcesz porównać takie obiekty w 'Select Case', powinieneś zrobić' Key' Public i porównać używając '.Key'. – mbomb007

5

Jak mogę uzyskać tę wartość przy użyciu ENUM? lub w inny sposób to zrobić.

Istnieją trzy powszechne sposoby wartości enum odwzorowywania struny

  • Używając Dictionary(Of YourEnumType, String)
  • Dekoracje wartości ENUM ze atrybutów (np DescriptionAttribute) i sprowadzić je odbicia
  • użyć Switch oświadczenie

Pierwsza z tych opcji to prawdopodobnie najprościej, moim zdaniem.

+1

dzięki jon. W rzeczywistości jestem nowy w aplikacji Windows. czy możesz dać mi trochę więcej na temat pierwszej drogi (Słownik ..)? –

+6

@BrijeshPatel: Stack Overflow nie jest dobrym sposobem nauki od zera. Sugeruję, abyś przeczytał dokumentację "Dictionary" i najlepiej przeczytał dobrą książkę VB, która powinna obejmować zbiory. –

+1

Ohh ok. ale dzięki za cenne sugestie. –

4

Jak korzystać z funkcji znakowania.Coś jak:

Public Enum MyEnum 
<StringValue("Personal Contact")>Contact 
<StringValue("My PersonalInfo")>PersonalInfo 
End Enum 

Trzeba by napisać atrybut StringValue jak:

Public Class StringValueAttribute 
    Inherits Attribute 

    Public Property Value As String 
    Public Sub New(ByVal val As String) 
     Value = val 
    End Sub 

End Class 

Aby go:

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 

a następnie wezwanie do zdobycia wyliczenia (z użyciem atrybut ciągu znaków):

Dim mEnum as MyEnum = GetEnumByStringValueAttribute(Of MyEnum)("Personal Contact") 

Aby uzyskać wartość "atrybut" out (usunięty obsługi 'nic' dla jasności):

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 

i wezwanie, aby uzyskać atrybut ciąg (używając Enum):

Dim strValue as String = GetEnumValue(Of MyEnum)(MyEnum.Contact) 
+0

jak mogę uzyskać ciąg stały? –

+0

@Mahan - dodano do kodu powyżej – Denis

+1

Zbyt zawiłe tylko dla wyliczenia ciągów. –

35

dla wartości nie całkowite, Const w A Structure (lub Class) może być wykorzystane zamiast:

Structure Test 
    Const PersonalInfo = "Personal Info" 
    Const Contanct = "Personal Contanct" 
End Structure 

lub w Module dla bezpośredniego dostępu bez Test. części:

Module Test 
    Public Const PersonalInfo = "Personal Info" 
    Public Const Contanct = "Personal Contanct" 
End Module 

w niektórych przypadkach, nazwa zmiennej może być stosowana jako wartość:

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) 
+2

Powód wolę to w klasie, ponieważ wyliczenia te nigdy nie mają być tworzone. Są to wyliczenia strun zebrane razem w jednym miejscu, a następnie odniesione gdzie indziej z notacją kropkową. Zauważ, że nie deklarujemy żadnej instancji tej struktury. Jest to struktura służąca wyłącznie do przechowywania stałych. Możesz zrobić to samo z klasą. Widziałem też, że ludzie robią tylko readonly z klasą. Ale są to stałe łańcuchowe. Więc używamy const. –

2

wiem, że to jest stary post, znalazłem fajne rozwiązanie, które warto udostępnić:

''' <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 

Zastosowanie:

'Can be anywhere in you applicaiton: 
Link.xChangeCycleActive 

Zapobiega to niepożądanemu dodatkowego kodowania, jest łatwa w utrzymaniu i myślę, że ten minimalizuje dodatkowy narzut procesora.

także visual studio pokazuje ciąg atrybutów tuż po wpisaniu „Link” tak jak gdyby to jest regularny Enum

+0

Jaka jest wartość zwracana dla pierwszej stałej? "scVirtualMaster" lub "<.lrAutoSpeed>" – RonaldPaguay

+0

zwraca kompletny ciąg, aby: scVirtualMaster <.lrAutoSpeed> –

0

Jeśli wszystko, co chcesz zrobić, to wyświetla teksty stałe na liście lub combo, można użyć tagging, takich jak

Private Enum MyEnum 
    Select_an_option___ 
    __ACCOUNTS__ 
    Invoices0 
    Review_Invoice 
    __MEETINGS__ 
    Scheduled_Meetings0 
    Open_Meeting 
    Cancelled_Meetings0 
    Current_Meetings0 
End Enum 

Następnie wyciągnąć MyEnum na sznurku i używać Replace (lub Regex) zastąpić tagi: "___" z "...", "__" z "**", „_ "z" "i usuń końcowe numery. A następnie włóż go do tablicy i zrzucić go w combobox, który będzie wyglądać następująco:.

Select an option... 
**ACCOUNTS** 
Invoices 
Review Invoice 
**MEETINGS** 
Scheduled Meetings 
Open Meeting 
Cancelled Meetings 
Current Meetings 

(można używać numerów, powiedzmy, wyłączyć pole tekstowe do wprowadzania numer faktury lub salę konferencyjną W na przykład: Review Invoice i Open Meeting może oczekiwać dodatkowych danych wejściowych, więc pole tekstowe może być włączone dla tych wyborów.)

Podczas analizowania wybranego elementu kombi, wyliczenie będzie działało zgodnie z oczekiwaniami, ale naprawdę trzeba tylko dodać pojedynczą linię kodu - zastąpienie tekstu - aby uzyskać wygląd kombi zgodnie z oczekiwaniami.

(Wyjaśnienie dotyczy około 10 razy więcej niż rzeczywiste rozwiązanie!)

Powiązane problemy