Универсальная функция с (Of T как что?) Для принятия String, Integer, DateTime? - PullRequest
1 голос
/ 22 июля 2011

У меня есть эта функция:

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 был равен Nullable (Of T).Это означает, что я должен иметь T в качестве структуры, иначе это говорит мне, что не будет работать.Похоже, что если мне нужно изменить значение T, мне нужно выполнить какое-то вычисление, чтобы исключить из значения var значение null или нет.

РЕДАКТИРОВАТЬ:

Я попытался перегрузить этот метод, чтобы один возвращал 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)

И, естественно, он говорит, что не может этого сделать, поскольку они просто различаются по типам возвращаемых данных.Есть ли способ перегрузить это?Я действительно не хочу иметь две функции.

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

Это потому, что String не может быть обнуляемым и не является Structure или типом значения.Это ссылочный тип.

У вас просто должны быть некоторые перегрузки, которые возвращают версии String и Nullable.

1 голос
/ 22 июля 2011

Как бы бесполезно это ни было, AFAIK, нет способа обойти это с помощью дженериков.

Почему бы просто не работать с 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
...