问题描述
不久前C#添加了一个不错的“模式匹配”功能,您可以在一个语句中检查对象的类型并将其强制转换为该类型:
object o = GetSomeObjectFromTheDatabase();
if (o is Person p)
{
Console.WriteLine($"{p.Name} is {p.Age} years old.");
}
VB.NET是否具有类似的功能,还是像过去一样必须进行类型检查并进行两个单独的操作?
解决方法
正如我之前在自己的评论中指出的(和上一个答案中提到的Codexer一样),该功能不在VB中。
根据Microsoft(https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/)的最新评论,似乎不太可能在不久的将来将该功能添加到该语言中。话虽这么说,该语言仍然具有非常丰富的功能,而对于日常开发而言,它却很少丢失。如果您正在考虑是否要在VB中进行进一步的开发,则应考虑开发资源的可用性(内部和外部),VB对项目的适用性以及当前的代码库。
,很遗憾,VB
没有注释中已经提到的模式匹配。一种选择是创建一个模块,这样我们就可以创建一个扩展,以便在需要键入match的任何东西上使用。
Imports System.Runtime.CompilerServices
Module Extensions
<Extension()>
Public Function IsPatternMatch(Of T)(MyObj As Object,ByRef outObj As T) As Boolean
Dim isMatch As Boolean = TypeOf MyObj Is T
outObj = If(isMatch,CType(MyObj,T),outObj)
Return isMatch
End Function
End Module
示例用法:
Dim o As Object = Nothing
Dim p As Person = Nothing
o = GetSomeObjectFromTheDatabase()
If o.IsPatternMatch(p) Then
' Do something with p now...
End If
,
.TryCast
可能就是您想要的。如果成功,它将进行分配,否则返回Nothing。为了测试,我只是注释掉了2条Return
语句之一。请注意,如果返回Coffee
,则基础类型为c
。
Private Function GetSomeObjectFromTheDatabase() As Object
Dim dt = LoadCoffeeTable() 'Returns a DataTable
Dim c = New Coffee(CInt(dt(0)(0)),dt(0)(1).ToString,dt(0)(2).ToString)
'Return c
Return "I am not a Coffee"
End Function
Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click
Dim o As Object = GetSomeObjectFromTheDatabase()
Dim p As Coffee = TryCast(o,Coffee)
If p Is Nothing Then
MessageBox.Show("Object is not a Coffee " & o.ToString)
Else
MessageBox.Show(p.Name)
End If
End Sub