泛型函数(Of T as What?)接受String, Integer, DateTime



我已经得到了这个函数:

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或值类型。它是一个引用类型。

您应该有一些重载,返回StringNullable版本。

尽管这可能没有帮助,但我想没有办法用泛型来解决这个问题。

为什么不直接使用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

最新更新