VB.Net

2012-09-07 16 views
20

में स्ट्रिंग ENUM परिभाषित करें मैं अपने प्रोजेक्ट के लिए विंडो एप्लिकेशन का उपयोग कर रहा हूं। ऐसी स्थिति है जहां मुझे स्ट्रिंग एनम को परिभाषित करने और अपनी परियोजना में इसका उपयोग करने की आवश्यकता है।VB.Net

अर्थात

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

    Public Enum Test 
     PersonalInfo 
     Contanct 
    End Enum 

अब मैं उस चर personalinfo और अनुबंध के रूप में "व्यक्तिगत जानकारी" और "व्यक्तिगत Contanct" का मान चाहते हैं।

ईएनएन का उपयोग करके मैं यह मूल्य कैसे प्राप्त कर सकता हूं? या ऐसा करने का कोई और तरीका।

अग्रिम धन्यवाद ...

उत्तर

18

तुम सिर्फ एक नए प्रकार

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

उत्पादन:

व्यक्तिगत Contanct
व्यक्तिगत जानकारी

+1

संरचना समाधान (स्लाई द्वारा) कोड की 4 पंक्तियों में एक ही चीज़ को पूरा करता है। –

+0

@ जोनहार्बर एर्म ... नहीं। यह नहीं है। यह सिर्फ तारों का उपयोग करता है, इसलिए यह दृढ़ता से टाइप किए गए एनम पैटर्न के रूप में सुरक्षित प्रकार के रूप में नहीं है, इसे विस्तारित नहीं किया जा सकता है, और आप स्पष्ट रूपांतरण नहीं जोड़ सकते हैं। इसके अलावा, मुझे इस मामले में एक मॉड्यूल पर संरचना का उपयोग करने में एक बिंदु नहीं दिख रहा है। – sloth

+0

यदि आप इस तरह की वस्तुओं को 'केस का चयन करें' में तुलना करना चाहते हैं, तो आपको 'कुंजी' सार्वजनिक बनाना चाहिए और '.Key 'का उपयोग करके तुलना करना चाहिए। – mbomb007

5

मैं enum का उपयोग कर यह मान कैसे मिल सकता है? या ऐसा करने का कोई और तरीका।

वहाँ तार करने के लिए मानचित्रण enum मूल्यों के तीन आम तरीके हैं:

  • उपयोग एक Dictionary(Of YourEnumType, String)
  • विशेषताओं के साथ enum मूल्यों डेकोरेट (DescriptionAttribute जैसे) और उन्हें प्रतिबिंब
  • एक
  • उपयोग के साथ लाने के Switch कथन

इन विकल्पों में से पहला शायद संभवतः सबसे सरल, मेरे विचार में।

+1

धन्यवाद जोन। दरअसल मैं विंडोज़ एप्लिकेशन में नया हूं। क्या आप मुझे पहले तरीके से कुछ और संक्षिप्त दे सकते हैं (शब्दकोश ..)? –

+6

@ ब्रिजेशपेटेल: स्टैक ओवरफ़्लो वास्तव में स्क्रैच से सीखने का एक अच्छा तरीका नहीं है। मेरा सुझाव है कि आप 'डिक्शनरी' दस्तावेज पढ़ लें, और आदर्श रूप से एक अच्छी वीबी पुस्तक पढ़ें जिसमें संग्रह शामिल होना चाहिए। –

+1

ओह ठीक है। लेकिन वैसे भी आपके मूल्यवान सुझावों के लिए धन्यवाद। –

4

टैगिंग का उपयोग करने के बारे में कैसे।कुछ की तरह:

Public Class StringValueAttribute 
    Inherits Attribute 

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

End Class 

यह बाहर निकलने के लिए: तो (का उपयोग कर Enum प्राप्त करने के लिए एक कॉल

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 

और

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

आप के रूप StringValue विशेषता लिखने के लिए होता है स्ट्रिंग विशेषता):

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

"गुण" मूल्य बाहर निकलने के लिए (से निपटने स्पष्टता के लिए 'कुछ भी नहीं' हटा):

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

मैं स्ट्रिंग स्थिर कैसे प्राप्त कर सकता हूं? –

+0

@Mahan - – Denis

+1

से ऊपर दिए गए कोड में जोड़ा गया है, बस एक स्ट्रिंग गणना के लिए भी घुल गया। –

35

Structure Test 
    Const PersonalInfo = "Personal Info" 
    Const Contanct = "Personal Contanct" 
End Structure 
: गैर पूर्णांक मूल्यों, Const में एक Structure (या Class) के बजाय इस्तेमाल किया जा सकता के लिए

या Test. हिस्सा बिना सीधी पहुंच के लिए एक 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) 
+2

कारण मैं पसंद करता हूं कक्षा में यह इसलिए है क्योंकि इन गणनाओं को तत्काल नहीं माना जाता है। वे केवल एक ही स्थान पर इकट्ठे तारों की गणना हैं और फिर डॉट नोटेशन के साथ कहीं और संदर्भित हैं। इसके साथ नोटिस हम इस संरचना का कोई उदाहरण घोषित नहीं करते हैं। यह केवल स्थिरांक रखने के उद्देश्य के लिए एक संरचना है। आप एक वर्ग के साथ ऐसा ही कर सकते हैं। मैंने लोगों को कक्षा के साथ केवल पढ़ने योग्य गुण भी देखा है। लेकिन ये स्ट्रिंग स्थिरांक हैं। तो हम कॉन्स का उपयोग करते हैं। –

2

:

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

कुछ मामलों में, चर नाम एक मूल्य के रूप में इस्तेमाल किया जा सकता पुरानी पोस्ट में मुझे एक अच्छा समाधान मिला जो साझा करने लायक है:

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

+0

पहली स्थिरता के लिए वापसी मूल्य क्या है? "scVirtualMaster" या "<.lrAutoSpeed>" – RonaldPaguay

+0

यह पूरी स्ट्रिंग को वापस करता है: scVirtualMaster <.lrAutoSpeed> –

0

यदि आप केवल इतना सूची या कॉम्बो में enums प्रदर्शित कर रहा है क्या करना चाहते हैं, तो आप उपयोग कर सकते हैं पता चलता टैगिंग ऐसे

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

फिर एक स्ट्रिंग में MyEnum खींच और Replace (या Regex) का उपयोग टैग को बदलने के लिए: के साथ "___" "...", के साथ "__" "**", "_ "साथ" ", और पिछली संख्याओं को हटा दें। तो यह ऊपर repack एक सरणी में और एक combobox जो की तरह दिखाई देगा में डंप:।

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

(आप के लिए, कहते हैं नंबर, उपयोग कर सकते हैं एक चालान संख्या या बैठक कक्ष इनपुट करने के लिए एक पाठ क्षेत्र को निष्क्रिय में उदाहरण, Review Invoice और Open Meeting अतिरिक्त इनपुट की उम्मीद कर रहे हैं ताकि उन चयनों के लिए टेक्स्ट बॉक्स सक्षम हो सके।)

जब आप चयनित कॉम्बो आइटम को पार्स करते हैं, तो गणना अपेक्षित के रूप में काम करेगी, लेकिन कॉम्बो को आपकी इच्छानुसार देखने के लिए आपको केवल एक ही पंक्ति कोड - टेक्स्ट प्रतिस्थापन जोड़ने की आवश्यकता है।

(स्पष्टीकरण वास्तविक समाधान के रूप में लगभग 10 गुना शामिल है!)