Значение 'String' не может быть преобразовано в тип 'T'.Универсальная функция для получения строк запроса? - PullRequest
11 голосов
/ 22 июля 2011

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

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 = DirectCast(HttpContext.Current.Request.QueryString(queryStringVariable), T)
            End If
        End If

        Return queryStringObject
End Function

Который я надеялся назвать так:

Dim userId As Integer = SessionUtil.GetSessionValue(Of Integer)("uid")

Я пытался сделать его универсальным, поскольку в конце значение строки запроса может быть, по крайней мере, целым числом или строкой, но, возможно, также двойным и другими. Но я получаю ошибку:

Value of 'String' cannot be converted to Type 'T'

Я сделал то же самое с переменными Session, и это сработало. Кто-нибудь знает способ сделать эту работу?

РЕДАКТИРОВАТЬ: Джонатан Аллен ниже имеет более простой ответ, используя CObj () или CTypeDynamic (). Но ниже также работает от Преобразование строки в обнуляемый тип (int, double и т.д ...)

Dim conv As TypeConverter = TypeDescriptor.GetConverter(GetType(T))
queryStringObject = DirectCast(conv.ConvertFrom(queryStringVariable), T)

Ответы [ 2 ]

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

Самый безопасный способ - использовать CTypeDynamic.Это обеспечит использование неявных / явных операторов.

Function Convert(Of T)(s As String) As T
    Return Microsoft.VisualBasic.CTypeDynamic(Of T)(s)
End Function

Это будет работать для простых типов, но не для сложных.

Function Convert(Of T)(s As String) As T
    Return CType(CObj(s), T)
End Function
5 голосов
/ 22 июля 2011

Я думаю, проблема в том, что вы не можете привести строку к целому числу (или даже ко многим типам). Это должно быть проанализировано вместо этого.

Я не уверен, но CType () может сделать эту работу вместо DirectCast ().

...