Dot-Net

“字元串”的值無法轉換為“T”類型。獲取查詢字元串的通用函式?

  • July 21, 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 變數做了同樣的事情,它奏效了。任何人都知道使這項工作的方法嗎?

**編輯:**下面的 Jonathan Allen 使用 CObj() 或 CTypeDynamic() 有一個更簡單的答案。但以下也適用於將字元串轉換為可空類型(int、double 等…)

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

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

我認為問題在於您不能字元串轉換為整數(或者實際上是許多類型)。它需要被解析。

我不確定,但 CType() 可能會代替 DirectCast() 來完成這項工作。

引用自:https://stackoverflow.com/questions/6783049