我有一个函数,它有一个类型为"object"的selectedID参数。
如果我的参数是底层类型的默认值:即Integer默认值为零,我希望执行一些操作。
没有"严格开启",我可以使用:
If selectedID = Nothing Then
'Do Something
End If
我必须做这样的事情吗:
If (TypeOf selectedID Is Integer AndAlso selectedID.Equals(0)) _
OrElse (TypeOf selectedID Is String AndAlso selectedID.Equals(Nothing)) _
OrElse .. other types go here .. Then
'Do something
End If
或者我缺少一个更简单的方法吗?
我最终实现了Neolisk的建议,该建议的优点是简短、包罗万象且非常可重复使用:
Public Function IsDefaultObject(obj As Object) As Boolean
Return obj.Equals(GetDefaultValue(obj.GetType()))
End Function
Public Function GetDefaultValue(t As Type) As Object
If (t.IsValueType) Then Return Activator.CreateInstance(t)
Return Nothing
End Function
我最初采用的解决方案是创建一个函数IsDefaultObject(obj(,该函数告诉我对象是否分配了默认值。随着越来越多的类型被注意到,我计划添加到它中。
Private Function IsDefaultObject(obj As Object) As Boolean
If obj Is Nothing Then Return True
If String.IsNullOrEmpty(obj.ToString()) Then Return True
If obj.Equals(0) Then Return True
If obj.Equals(New Date()) Then Return True
Return False
End Function
当然,我本可以使用Hans Passant评论中的解决方案:
Private Function IsDefaultObject(obj As Object) As Boolean
Return Microsoft.VisualBasic.CompilerServices.Operators.
ConditionalCompareObjectEqual(obj, Nothing, False)
End Function
您也可以为此使用可为null的类型。
Dim selectedID As Integer? = nothing
...
if selectedID isnot nothing then
dim value as integer = selectedID.value
...
end if
另一种方法可以检查是否为可为null的类型分配了值。
if selectedID.hasValue = true then
dim value as integer = selectedID.value
...
end if