سؤال

وأنا أحاول لجعل وظيفة التي يمكن أن تتخذ نوع التعداد، وعرض كل الاختيارات الممكنة للمستخدم، والسماح لهم اختيار واحد ومن ثم تمرير مرة أخرى. الأدوية لا تسمح لك للحد من التعداد. لقد حصلت على عمل التعليمات البرمجية التي سوف يلقي ذهابا وإيابا، ولكن أود أن استعرض والعودة من نفس النوع التعداد.

وهذا الرمز يعمل ولكن ليس كذلك أود:

وظيفة عمومية getEnumSelection (الأساسية ByVal مالك وWindows.Forms.IWin32Window، الأساسية ByVal sampleValue و[التعداد]، الأساسية ByVal العنوان الفرعي كسلسلة) وسلسلة

    Dim names As String() = [Enum].GetNames(sampleValue.GetType)
    Using mInput As New dlgList
        mInput.ListBox1.Items.Clear()
        For Each name As String In names
            mInput.ListBox1.Items.Add(name)
        Next
        mInput.ShowDialog(owner)
        Return mInput.ListBox1.SelectedItem.ToString
    End Using
End Function

وبعد تشغيله أستطيع أن [التعداد] .parse على المتصل مباشرة إلى نوع التعداد منذ لدي الوصول إلى هناك، ولكن أود أن القضاء على هذه الخطوة اليدوية.

وأود أن يكون قادرا على العودة من نفس النوع التعداد أو على الأقل القيام تحليل إلى قيمة أن أتلقى ويلقي بها في هذه الوظيفة ولكن لا يبدو أن نسمح لهذا الخط.   نتيجة قاتمة كما كائن = [التعداد] .Parse (GetType (sampleValue)، mInput.ListBox1.SelectedItem.ToString، صحيح)

وتقول sampleValue ليس النوع. لذلك ... كيف يمكنني الحصول على نوع من sampleValue لتحليل؟

وأم أن هناك طريقة أخرى للسماح بسهولة وبشكل عام المستخدم لتحديد قيمة التعداد دون جهة الترميز وظيفة رسم الخرائط لكل التعداد؟

هل كانت مفيدة؟

المحلول

للرد على أصغر السؤال أولا، يمكنك الحصول على نوع من كائن من خلال الدعوة sampleValue.GetType ()، تماما مثل تفعلونه بالفعل في السطر الأول من الدالة. GetType على حد سواء والكلمة وطريقة لفئة كائن - أول يحصل على نوع من نوع (إلى حد ما مليئا بالحشو والتزييف) والثاني يحصل على نوع من مثيل كائن

وأما عن السؤال الأكبر، أود أن أقترح استخدام أسلوب عام مع القيد قليلا أكثر استرخاء على المعلمات: السماح لها قبول أي بنية، وليس فقط تتضمن التعدادات. تفقد قليلا من سلامة نوع، ولكن أعتقد أن هذا هو أحد المقايضة موافق. إذا شخص يمر في بنية غير التعداد، فإنها تحصل على ArgumentException في وقت التشغيل، لذلك ليست مثل كنت أحصل القمامة من وظيفة.

Public Function getEnumSelection(Of T As Structure)(ByVal owner As Windows.Forms.IWin32Window, ByVal subtitle As String) As T
    Dim names As String() = [Enum].GetNames(GetType(T))
    Using mInput As New dlgList
        mInput.ListBox1.Items.Clear()
        For Each name As String In names
            mInput.ListBox1.Items.Add(name)
        Next
        mInput.ShowDialog(owner)
        Return DirectCast([Enum].Parse(GetType(T), mInput.ListBox1.SelectedItem.ToString), T)
    End Using
End Function
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top