2012-09-07 57 views
20

Tôi đang sử dụng Window Application cho dự án của mình. Có tình huống mà tôi cần phải xác định chuỗi enum và sử dụng nó trong dự án của tôi.Xác định chuỗi ENUM trong VB.Net

ví dụ:

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

    Public Enum Test 
     PersonalInfo 
     Contanct 
    End Enum 

Bây giờ tôi muốn giá trị của biến đó personalinfo và hợp đồng như "Thông Tin Cá Nhân" và "Contanct cá nhân".

Làm cách nào tôi có thể nhận được giá trị này bằng ENUM? hoặc cách nào khác để làm điều đó.

Cảm ơn trước ...

Trả lời

18

Bạn chỉ có thể tạo ra một loại

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

mới và khi bạn sử dụng nó, nó kinda trông như một enum:

Sub Main 

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

End Sub 

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

đầu ra:

cá nhân Contanct
Thông tin cá nhân

+1

Giải pháp cấu trúc (bởi Slai) hoàn thành điều tương tự trong 4 dòng mã. –

+0

@JonHarbour Erm ... Không. Không. Nó chỉ sử dụng các chuỗi, do đó, nó không phải là loại an toàn như các mẫu enum mạnh mẽ gõ, nó không thể được mở rộng, và bạn không thể thêm chuyển đổi rõ ràng. Ngoài ra, tôi không thấy một điểm trong việc sử dụng một cấu trúc trên một mô-đun trong trường hợp này. – sloth

+0

Nếu bạn muốn so sánh các đối tượng như thế này trong trường hợp 'Chọn trường hợp ', bạn nên đặt' Khóa công khai' và so sánh bằng cách sử dụng '.Key'. – mbomb007

5

Làm thế nào tôi có thể nhận được giá trị này sử dụng ENUM? hoặc cách nào khác để làm điều đó.

Có ba cách phổ biến các giá trị enum lập bản đồ thành các chuỗi:

  • Sử dụng một Dictionary(Of YourEnumType, String)
  • Trang trí các giá trị enum với các thuộc tính (ví dụ DescriptionAttribute) và lấy chúng với phản ánh
  • Dùng Switch tuyên bố

Tùy chọn đầu tiên trong số này có thể là đơn giản nhất, theo quan điểm của tôi.

+1

thanks jon. Trên thực tế tôi mới ở cửa sổ ứng dụng. bạn có thể cho tôi biết thêm một chút về cách đầu tiên (từ điển ..) không? –

+6

@BrijeshPatel: Stack Overflow không thực sự là một cách học tập tốt từ đầu. Tôi đề nghị bạn đọc các tài liệu 'Dictionary', và lý tưởng đọc một cuốn sách VB tốt mà nên bao gồm các bộ sưu tập. –

+1

Ohh ok. nhưng dù sao, nhờ lời đề nghị quý giá của bạn. –

4

Cách sử dụng Gắn thẻ.Một cái gì đó như:

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

Bạn sẽ phải viết các thuộc tính stringValue như:

Public Class StringValueAttribute 
    Inherits Attribute 

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

End Class 

Để có được nó ra:

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 

Và sau đó là một cuộc gọi để có được những Enum (sử dụng thuộc tính chuỗi):

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

Để có được "Thuộc tính" giá trị ra (tháo xử lý 'Không có gì' cho rõ ràng):

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 

Và cuộc gọi để có được những thuộc tính chuỗi (sử dụng Enum):

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

làm thế nào tôi có thể nhận được chuỗi liên tục? –

+0

@Mahan - được thêm vào mã ở trên – Denis

+1

Cách quá phức tạp chỉ để đếm một chuỗi. –

35

Đối với các giá trị không phải số nguyên, Const trong một số Structure (hoặc Class) có thể được sử dụng thay thế:

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

hoặc trong một Module để truy cập trực tiếp mà không cần phần Test.:

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

Trong một số trường hợp, các tên biến có thể được sử dụng như một giá trị:

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

Lý do tôi thích điều này trên lớp là bởi vì những liệt kê này không bao giờ có nghĩa là được khởi tạo. Họ chỉ là liệt kê các chuỗi được tập hợp lại với nhau ở một nơi duy nhất và sau đó được nhắc đến nơi khác với ký hiệu dấu chấm. Lưu ý rằng chúng ta không khai báo bất kỳ cá thể nào của cấu trúc này. Nó là một cấu trúc chỉ nhằm mục đích chứa các hằng số. Bạn có thể làm tương tự với một lớp học. Tôi cũng thấy mọi người làm thuộc tính chỉ đọc với một lớp. Nhưng đây là những hằng số chuỗi. Vì vậy, chúng tôi sử dụng const. –

2

Tôi biết đây là một bài đăng cũ đưa tôi tìm thấy một giải pháp tốt đẹp có giá trị chia sẻ:

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

Cách sử dụng:

'Can be anywhere in you applicaiton: 
Link.xChangeCycleActive 

Điều này ngăn không cho mã hóa không mong muốn, dễ bảo trì và tôi nghĩ điều này giúp giảm thiểu chi phí xử lý bổ sung.

Cũng visual studio cho thấy chuỗi thuộc tính ngay sau khi bạn gõ "Liên kết" giống như nếu nó là một Enum thường xuyên

+0

Giá trị trả lại cho const đầu tiên là gì? "scVirtualMaster" hoặc "<.lrAutoSpeed>" – RonaldPaguay

+0

nó trả về chuỗi hoàn chỉnh như sau: scVirtualMaster <.lrAutoSpeed> –

0

Nếu tất cả các bạn muốn làm là hiển thị đếm trong một danh sách hoặc kết hợp, bạn có thể sử dụng gắn thẻ như

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

Sau đó kéo MyEnum vào một chuỗi và sử dụng Replace (hoặc Regex) để thay thế các thẻ: "___" với "...", "__" với "**", "_ "với" "và xóa các số sau. Sau đó đóng gói lại nó lên thành một mảng và đổ nó vào một combobox đó sẽ giống như:.

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

(Bạn có thể sử dụng các con số để, nói, vô hiệu hóa một trường văn bản để nhập một số hóa đơn hoặc phòng họp Trong ví dụ: Review InvoiceOpen Meeting có thể mong đợi đầu vào bổ sung để hộp văn bản có thể được bật cho các lựa chọn đó.)

Khi bạn phân tích cú pháp mục được chọn, liệt kê sẽ hoạt động như mong đợi nhưng bạn chỉ cần thêm một dòng mã - văn bản thay thế - để có được kết hợp trông như bạn muốn.

(Giải thích khoảng 10 lần liên quan đến giải pháp thực tế!)

Các vấn đề liên quan