我已经得到了这个函数:
Public Class QueryStringUtil
Public Shared Function GetQueryStringValue(Of T As Structure)(ByVal queryStringVariable As String) As T
Dim queryStringObject As Nullable(Of T) = Nothing
If queryStringVariable <> Nothing Then
If HttpContext.Current.Request.QueryString(queryStringVariable) IsNot Nothing Then
queryStringObject = CTypeDynamic(Of T)(queryStringVariable)
End If
End If
Return queryStringObject
End Function
End Class
当我尝试这样调用它时:
Dim intTest As Integer = QueryStringUtil.GetQueryStringValue(Of Integer)("stuff")
Dim stringTest As String = QueryStringUtil.GetQueryStringValue(Of String)("stuff")
Dim datetimeTest As DateTime = QueryStringUtil.GetQueryStringValue(Of DateTime)("stuff")
stringTest给出错误:
'String' does not satisfy the 'Structure' constraint for type parameter 'T'.
我希望我们的其他开发人员在调用这个函数时不必担心必须将类转换为结构体或类似的东西。我只是希望他们能够在(Of T)中加入一个标准类型,并让它起作用。我不介意写额外的计算来实现这个目标。
另一个问题是我还需要这个函数能够返回一个实际的空值,所以我需要queryStringObject作为空值(of T),这意味着我必须把T作为结构,否则它告诉我这不会工作。因此,如果我改变T的值,我需要运行一些计算来声明变量为可空或不可空。
编辑:我尝试重载这个方法,这样一个返回T,一个返回Nullable(Of T),就像这样:
Public Shared Function GetQueryStringValue(Of T As Class)(ByVal queryStringVariable As String) As T
Public Shared Function GetQueryStringValue(Of T As Structure)(ByVal queryStringVariable As String) As Nullable(Of T)
很自然地,它告诉我它不能这样做,因为它们只是返回类型不同。有办法让这个超载吗?我真的不想有两个函数
这是因为String
不能为空,也不是Structure
或值类型。它是一个引用类型。
您应该有一些重载,返回String
和Nullable
版本。
尽管这可能没有帮助,但我想没有办法用泛型来解决这个问题。
为什么不直接使用Object
?是性能问题吗?
Public Shared Function GetQueryStringValue(ByVal queryStringVariable As String, ByVal t As Type) As Object
Dim queryStringObject As Object = Nothing
If queryStringVariable <> Nothing Then
If HttpContext.Current.Request.QueryString(queryStringVariable) IsNot Nothing Then
queryStringObject = CTypeDynamic(queryStringVariable, t)
End If
End If
Return queryStringObject
End Function