حدد حالة على نوع الكائن في VB.NET
-
19-09-2019 - |
سؤال
لست متأكدا مما إذا كان هذا صحيح C #، ولكن نأمل أن تحصل على الفكرة. :)
switch (msg.GetType()) {
case ClassA:
// blah
case ClassB:
// blah 2
case ClassC:
// blah 3
}
كيف يمكنني تشغيل نوع كائن ولكن باستخدام VB.NET Select Case
?
أنا أدرك أن البعض قد يقترح استخدام تعدد الأشكال, ، لكنني أستخدم تسلسل هرمي لفئات الرسائل الصغيرة بحيث لا يعمل حقا في حالتي.
المحلول
مع VB 2010، بالنسبة للمشاريع التي تستهدف .NET Framework 4 والإصدارات الأحدث، يمكنك الآن القيام بذلك:
Select Case msg.GetType()
Case GetType(ClassA)
End Select
في إصدارات VB السابقة، لم تنجح لأنك لا تستطيع مقارنة نوعين بالمساواة. يجب عليك التحقق مما إذا كانت تشير إلى نفس المرجع باستخدام الكلمة الأساسية. لا يمكن القيام بذلك في حالة مختارة، ما لم تستخدم خاصية من النوع مثل الاسم أو الاسم الكامل للمقارنة، كما اقترح Michael. يمكنك استخدام مزيج من IF و ElseIf على الرغم من:
Dim type = msg.GetType()
If type Is GetType(ClassA)
...
ElseIf type Is GetType(ClassB)
...
...
End If
نصائح أخرى
حسنا، إذا أصرت على استخدام حالة تحديد، فيمكنك دائما الذهاب مع:
Select Case True
Case TypeOf msg Is ClassA
' do something '
Case TypeOf msg Is ClassB
' do something else '
Case Else
' and so on '
End Select
لكنني أتصور معظم الناس يحبون تجنب هذا النوع من الأشياء. إذا / سيليف ربما يكون أكثر وضوحا.
هذه طريقة للتعامل مع الأحداث النقدية من Button1 و Button2 في نفس الفرعية (بدأت كمبرمج VB6، لذلك هذا بديل جيد لمناولة VB6 من صفائف التحكم)
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
Select Case True
Case sender Is Me.Button1
' Do Button1 stuff '
Case sender Is Me.Button2
' Do Button2 stuff '
End Select
End Sub
لن أفعل على الإطلاق select case true
, ، ولكن يمكنك القيام بذلك:
Select Case msg.GetType.Name
Case GetType(ClassA).Name
...
Case GetType(ClassB).Name
...
Case Else
...
End Select
وهو نظافة ثقيلة النظر من هذا:
If msg.GetType Is GetType(ClassA) Then
...
ElseIf msg.GetType Is GetType(ClassB) Then
...
Else
...
End If
هذه:
Dim a As Object = New TextBox
Select Case True
Case TypeOf a Is TextBox
MsgBox("aaa")
Case TypeOf a Is ComboBox
Case TypeOf a Is ListBox
End Select