'String'的值不能转换为Type'T'.获取查询字符串的通用函数?

Sve*_*ang 11 .net vb.net generics type-conversion query-string

我有这个功能:

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
Run Code Online (Sandbox Code Playgroud)

我希望这样称呼:

Dim userId As Integer = SessionUtil.GetSessionValue(Of Integer)("uid")
Run Code Online (Sandbox Code Playgroud)

我试图使它成为通用的,因为最后查询字符串值可能至少是一个整数或一个字符串,但也可能是一个double和其他.但我得到错误:

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

我用Session变量完成了同样的事情并且它有效.有人知道如何使这项工作?

编辑:下面的乔纳森艾伦有一个更简单的答案使用CObj()或CTypeDynamic().但是下面也可以从Convert string到nullable类型(int,double等等)

Dim conv As TypeConverter = TypeDescriptor.GetConverter(GetType(T))
queryStringObject = DirectCast(conv.ConvertFrom(queryStringVariable), T)
Run Code Online (Sandbox Code Playgroud)

Jon*_*len 16

最安全的方法是使用CTypeDynamic.这将确保使用隐式/显式运算符.

Function Convert(Of T)(s As String) As T
    Return Microsoft.VisualBasic.CTypeDynamic(Of T)(s)
End Function
Run Code Online (Sandbox Code Playgroud)

这适用于简单类型,但对于复杂类型则无效.

Function Convert(Of T)(s As String) As T
    Return CType(CObj(s), T)
End Function
Run Code Online (Sandbox Code Playgroud)


Ste*_*gan 5

我认为问题在于你不能字符串强制转换为整数(或者实际上是多种类型).它需要被解析.

我不确定,但是CType()可能会做而不是DirectCast().

  • 代码`DirectCast("5",Integer)`不能在VB 10下编译. (2认同)