在 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 版本中,它不起作用,因为您无法比较两个类型是否相等。您必须使用 Is 关键字检查它们是否指向相同的引用。在 Select Case 中不可能执行此操作,除非您按照 Michael 的建议使用 Name 或 FullName 等类型的属性进行比较。不过,您可以组合使用 If 和 ElseIf:
Dim type = msg.GetType()
If type Is GetType(ClassA)
...
ElseIf type Is GetType(ClassB)
...
...
End If
其他提示
好吧,如果您坚持使用 Select Case,您可以随时选择:
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
但我想大多数人都喜欢避免这种事情。If/ElseIf 可能会更清楚。
这是在同一个子中处理 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
不隶属于 StackOverflow