“字符串”的值无法转换为“T”类型。获取查询字符串的通用函数?

Posted

技术标签:

【中文标题】“字符串”的值无法转换为“T”类型。获取查询字符串的通用函数?【英文标题】:Value of 'String' cannot be converted to Type 'T'. Generic function for getting query strings? 【发布时间】:2011-10-10 14:45:58 【问题描述】:

我有这个功能:

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 变量做了同样的事情,它奏效了。任何人都知道如何使这项工作?

编辑: 下面的 Jonathan Allen 使用 CObj() 或 CTypeDynamic() 给出了更简单的答案。但以下也适用于Convert string to nullable type (int, double, etc...)

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

【问题讨论】:

我很好奇错误消息中对 Type 'T' 的引用。这是运行时错误还是编译时错误?请原谅缺乏明确的答案;自 VB6 以来,我一直避免使用 VB。 @Steve Morgan,这是一个编译时错误。 【参考方案1】:

最安全的方法是使用 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

【讨论】:

这很好,我也发现这也有效:Dim conv As TypeConverter = TypeDescriptor.GetConverter(GetType(T)), then set it via queryStringObject = DirectCast(conv.ConvertFrom(queryStringVariable), T) 请在此处查看我的相关但不同的问题:***.com/questions/6792050/… 我在实施时遇到了问题。【参考方案2】:

我认为问题在于您不能字符串转换为整数(或者实际上,许多类型)。它需要被解析。

我不确定,但 CType() 可能代替 DirectCast() 完成这项工作。

【讨论】:

不要认为这是问题,我可以输入:DirectCast("5", Integer) 没问题。与CType 相同。但是你能举例说明你的意思吗?我对解析有点熟悉,但不是一般... 我也认为这与此答案的原因相同。也许VB做了一些额外的魔法。你能放一个断点,看看这个值实际上是可以转换成整数的吗?并且 DirectCast("5", Integer) 在 VB 中实际执行没有错误吗? 代码DirectCast("5", Integer)在VB 10下无法编译。 好吧,其实我错了,我的错误列表一定是更新慢了,Jonathan Allen 是对的,就是编译不出来。

以上是关于“字符串”的值无法转换为“T”类型。获取查询字符串的通用函数?的主要内容,如果未能解决你的问题,请参考以下文章

无法将“字符串”类型的值转换为预期的参数类型“数据”

无法将“字符串”类型的值转换为预期的参数类型 [任何]

iOS-无法将“字符串”类型的值转换为预期的参数类型“数据”

无法强制将“字符”类型的值转换为“字符串”类型

无法将“字符串”类型的值转换为预期的参数类型

无法将“字符串”类型的值转换为预期的参数类型“布尔”